3 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
更新Swift 3語法:
如果您不關(guān)心是否存在可選方法,只需調(diào)用即可 delegate?.optionalMethod?()
否則,使用guard
可能是最好的方法:
weak var delegate: SomeDelegateWithOptionals?func someMethod() { guard let method = delegate?.optionalMethod else { // optional not implemented alternativeMethod() return } method()}
原始答案:
您可以使用“if let”方法測試這樣的可選協(xié)議:
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貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
如上所述,在Swift中,大多數(shù)情況下,您可以使用?可選的unwrapper運(yùn)算符實(shí)現(xiàn)所需的功能。這允許您在對象上調(diào)用方法,當(dāng)且僅當(dāng)對象存在(而不是nil)并且方法已實(shí)現(xiàn)時(shí)。
在您仍然需要的情況下respondsToSelector:,它仍然作為NSObject協(xié)議的一部分。
如果您respondsToSelector:在Swift 中調(diào)用Obj-C類型,那么它的工作方式與您期望的相同。如果您在自己的Swift類中使用它,則需要確保您的類派生自NSObject。
這是一個(gè)Swift類的示例,您可以檢查它是否響應(yīng)選擇器:
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
重要的是不要遺漏參數(shù)名稱。在這個(gè)例子中,Selector("sleep::")是不一樣的Selector("sleep:minutes:")。

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