2016-12-23 9 views
1

Ich habe gerade angefangen, Swift 3 zu lernen, und ich konvertiere diesen Code in Ziel-c zu Swift 3 und ich bin bei typealias stecken. Ich habe danach gesucht, und vielleicht gibt es schon richtige Hilfe, aber das hat mein Problem nicht gelöst.

Das ist die Linie in Objective-C:So rufen Sie die Typalias in Swift

typedef void (^TagBlock)(NSString *tagText, NSInteger idx); 

Und es ist eine Eigenschaft, für sie als @property (nullable, copy) TagBlock tapBlock; in Objective-c.
Jetzt habe ich die obige Zeile wie umgewandelt:

typealias TagBlock = (_ tagText: NSString,_ idx: NSInteger) -> Void 

Welche etwas verstehe ich Syntax weist sehr gut ist und das Eigentum ist var tapBlock: TagBlock! bei schnell.

Nun, wie ich versuche, es zu nennen in einer der @IBAction Methoden wie:

if (tapBlock != nil) { 
    self.setTapBlock(tapBlock: (tagButton.titleLabel?.text,tag) -> Void) 
} 

Dies gibt einen Fehler wie:

Expected type before '->'

Diese Linie in Ziel ist:

if (_tapBlock) { 
    _tapBlock(sender.titleLabel.text, self.tag); 
    } 



UPDATE Nach import UIKit habe ich 01 hinzugefügtund danach var tapBlock: TagBlock!
In class TagView: UIView ich es den Fehler geben Sie mir bei tapBlock?(sender.titleLabel.text, self.tag) So in ein @IBAction als

@IBAction func tagTapped(_ sender: Any) { 
    if (tapBlock != nil) { 
      tapBlock?(sender.titleLabel.text, self.tag) 
     } 
    } 

Aufruf in:

Cannot call value of non-function type 'TagBlock'`

Antwort

3

nullable ist optional in Swift, und in Swift 3 Verwenden Sie keine Unterstriche und Parameterbeschriftungen.

Das entspricht:

typealias TagBlock = ((String, Int) -> Void)? 

und Sie können es einfach anrufen

tapBlock?(sender.titleLabel.text, self.tag) 

Durch optional die Schließung Chaining wird nicht aufgerufen werden, wenn tapBlocknil ist.

+0

es gibt einen Fehler 'Kann Wert des Nichtfunktionstyps 'TagBlock' nicht aufrufen –

+0

Eine andere Konvention, ich erwähne es für die Fertigstellung, ist' Void' zu verwenden, wo die Parameter Void und '()' sind, wenn Rückgabetyp ist ungültig. so eine Alternative ist 'typalias TagBlock = ((String, Int) ->())?' – Abizern

+0

@ChaudhryTalha Bearbeiten Sie Ihre Frage und fügen Sie den Code, der den Fehler verursacht. – vadian