亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是Swift等效的respondsToSelector?

什么是Swift等效的respondsToSelector?

素胚勾勒不出你 2019-08-26 15:07:32
什么是Swift等效的respondsToSelector?我用谷歌搜索,但無法找出快速等同于什么respondsToSelector:。這是我唯一能找到的東西(Swift替代respondsToSelector :)但在我的情況下并不太重要,因為它檢查委托的存在,我沒有委托我只想檢查是否存在新的API或者不在設備上運行時,如果沒有回到以前版本的api。
查看完整描述

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()}


查看完整回答
1 反對 回復 2019-08-26
?
LEATH

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:")。


查看完整回答
反對 回復 2019-08-26
?
HUH函數

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()}


查看完整回答
反對 回復 2019-08-26
  • 3 回答
  • 0 關注
  • 2155 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號