2014-11-25 2 views
2

Каков наилучший способ вызова дополнительных функций делегата в Swift?Каков наилучший способ вызова дополнительных функций делегата в Swift

Предположим, что у меня есть следующий протокол:

@objc protocol SomeDelegate { 

    optional func someOptionalFunction(sender: AnyObject) 

} 

и у меня есть класс, который выглядит следующим образом:

class Foo { 

    var delegate: SomeDelegate! = nil 

    func someFunction(email: String, password: String) { 
     self.delegate.someOptionalFunction?(self) 
    } 

} 

Должен ли я называть это так или нет? Если нет, какова наилучшая практика?

Заранее спасибо.

+0

кнопку [опционально сцепление] (https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/OptionalChaining.html) является одним из наиболее распространенных моделей в быстром, так что, ИМХО, вы делаете это правильно – tkanzakic

ответ

1

«?» бит в этом вызове - это то, что делает его безопасным для вызова, независимо от того, реализован ли дополнительный делегат или нет. Это все, что я сделал бы в своем собственном коде.

Если вы абсолютно точно хотите знать, что существует someOptionalFunction, you could always use respondsToSelector, который существует для каждого экземпляра NSObject. Но это почти наверняка излишне.

+0

Хотя имя вопроса-after-method-name описано в разделе «Использование Swift с Cocoa и Objective-C», я не могу найти документацию по этому вопросу в «Быстрого языка программирования». У вас, случайно, есть ссылка? –

+0

[Ниже приведен раздел «Факультативный цепочки» на языке Word для быстрого программирования Apple doc] (https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/OptionalChaining.html#//apple_ref/doc/uid/TP40014097-CH21-XID_368). Я думаю, что вы запрашиваете бит «Calling Methods Through Optional Chaining»? –

+0

Да, я смотрел именно на эту штуку. Но я не могу найти упоминания синтаксиса 'method?()', Который динамически проверяет, реализуется ли этот метод. –

0

someOptionalFunction?(self) абсолютно в порядке. но ...

В основном, ссылка на делегата должна быть weak и дополнительно.

class Foo { 

    weak var delegate: SomeDelegate? = nil 
// ^^^^       ^ 
    func someFunction(email: String, password: String) { 
     self.delegate?.someOptionalFunction?(self) 
//     ^
    } 
} 
+1

Есть исключения из этого правила (некоторые видные в структурах Apple). –