2016-12-23 4 views
1

Я только что начал изучать swift 3, и я преобразовываю этот код в объектив-c в swift 3, и я застрял в typealias. Я искал его, и, возможно, появилась правильная помощь, но она не решила мою проблему.

Это строка в Objective-C:Как назвать типалиа в Swift

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

И есть свойство для него как @property (nullable, copy) TagBlock tapBlock; в Objective-C.
Теперь я преобразовал выше линии, как:

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

Что-то я очень хорошо понимаю, синтаксис мудрый и свойство в случае стрижа var tapBlock: TagBlock!.

Теперь, когда я пытаюсь вызвать его в одном из @IBAction методов, как:

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

Это дает ошибку, как:

Expected type before '->'

Эта линия цели является:

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



ОБНОВЛЕНИЕ После import UIKit Я добавил typealias TagBlock = ((String, Int) -> Void)? и после этого var tapBlock: TagBlock!
В class TagView: UIView я звоню в в @IBAction как

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

Так что в tapBlock?(sender.titleLabel.text, self.tag) он дает мне ошибку:

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

ответ

3

nullable является необязательным в Swift, и в Swift 3 не используйте символы подчеркивания и метки параметров.

эквивалент является:

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

и вы можете назвать это просто

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

Благодаря желанию цепочки закрытия не будет вызываться, если tapBlock является nil.

+0

это сообщение об ошибке «Невозможно вызывать значение нефункционного типа« TagBlock » –

+0

Другим соглашением, которое я упоминаю для его завершения, является использование« Void », где параметры Void и'() ', когда Тип возврата недействителен. поэтому альтернативой является 'typealias TagBlock = ((String, Int) ->())?' – Abizern

+0

@ChaudhryTalha Измените свой вопрос и добавьте код, который вызывает ошибку. – vadian