3 回答

TA貢獻2065條經驗 獲得超14個贊
更新Swift 3語法:
如果您不關心是否存在可選方法,只需調用即可 delegate?.optionalMethod?()
否則,使用guard
可能是最好的方法:
weak var delegate: SomeDelegateWithOptionals?func someMethod() { guard let method = delegate?.optionalMethod else { // optional not implemented alternativeMethod() return } method()}
原始答案:
您可以使用“if let”方法測試這樣的可選協議:
weak var delegate: SomeDelegateWithOptionals?func someMethod() { if let delegate = delegate { if let theMethod = delegate.theOptionalProtocolMethod? { theMethod() return } } // Reaching here means the delegate doesn't exist or doesn't respond to the optional method alternativeMethod()}

TA貢獻1936條經驗 獲得超7個贊
如上所述,在Swift中,大多數情況下,您可以使用?可選的unwrapper運算符實現所需的功能。這允許您在對象上調用方法,當且僅當對象存在(而不是nil)并且方法已實現時。
在您仍然需要的情況下respondsToSelector:,它仍然作為NSObject協議的一部分。
如果您respondsToSelector:在Swift 中調用Obj-C類型,那么它的工作方式與您期望的相同。如果您在自己的Swift類中使用它,則需要確保您的類派生自NSObject。
這是一個Swift類的示例,您可以檢查它是否響應選擇器:
class Worker : NSObject
{
func work() { }
func eat(food: AnyObject) { }
func sleep(hours: Int, minutes: Int) { }
}
let worker = Worker()
let canWork = worker.respondsToSelector(Selector("work")) // true
let canEat = worker.respondsToSelector(Selector("eat:")) // true
let canSleep = worker.respondsToSelector(Selector("sleep:minutes:")) // true
let canQuit = worker.respondsToSelector(Selector("quit")) // false
重要的是不要遺漏參數名稱。在這個例子中,Selector("sleep::")是不一樣的Selector("sleep:minutes:")。

TA貢獻1836條經驗 獲得超4個贊
沒有真正的Swift替代品。
您可以通過以下方式辦理登機手續:
someObject.someMethod?()
someMethod
只有在對象上定義了方法,才會調用該方法,someObject
但只能將其用于@objc
已聲明方法的協議optional
。
Swift本質上是一種安全的語言,所以每當你調用一個方法時,Swift必須知道方法就在那里。無法進行運行時檢查。你不能只對隨機對象調用隨機方法。
即使在Obj-C中你也應該盡可能避免使用這些東西,因為它與ARC不能很好地結合(ARC會觸發警告performSelector:
)。
但是,在檢查可用的API時respondsToSelector:
,即使是Swift,如果要處理NSObject
實例,仍然可以使用:
@interface TestA : NSObject- (void)someMethod;@end@implementation TestA//this triggers a warning@end
var a = TestA()if a.respondsToSelector("someMethod") { a.someMethod()}
- 3 回答
- 0 關注
- 2155 瀏覽
添加回答
舉報