第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Swift中performSelector的替代選擇?

Swift中performSelector的替代選擇?

江戶川亂折騰 2019-10-11 10:46:39
該performSelector方法的家庭中未提供斯威夫特。那么,如何在@objc對象上調(diào)用方法,而要在運(yùn)行時(shí)選擇要調(diào)用的方法,而在編譯時(shí)卻不知道該方法呢?NSInvocation顯然在Swift中也不可用。我知道在Swift中,您可以將任何方法(對于該@objc方法可見的方法聲明)發(fā)送給type AnyObject,類似于id在Objective-C中。但是,這仍然需要您在編譯時(shí)對方法名稱進(jìn)行硬編碼。有沒有辦法在運(yùn)行時(shí)動態(tài)選擇它?
查看完整描述

3 回答

?
子衿沉夜

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

使用閉包


class A {

    var selectorClosure: (() -> Void)?


    func invoke() {

        self.selectorClosure?()

    }

}


var a = A()

a.selectorClosure = { println("Selector called") }

a.invoke()

請注意,這并不是什么新鮮事物,即使在Obj-C中,新的API也更喜歡使用塊performSelector(與new 相比UIAlertView,比較使用respondsToSelector:和performSelector:調(diào)用委托方法UIAlertController)。


使用performSelector:始終是不安全的,并且不能與ARC配合使用(因此有ARC警告performSelector:)。


查看完整回答
反對 回復(fù) 2019-10-11
?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊

方法A

使用NSThread.detachNewThreadSelector,關(guān)于這種方法的好處是我們可以將對象附加到消息上。ViewController中的示例代碼:


override func viewDidLoad() {

    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.


    let delay = 2.0 * Double(NSEC_PER_SEC)

    var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

    dispatch_after(time, dispatch_get_main_queue(), {

        NSThread.detachNewThreadSelector(Selector("greetings:"), toTarget:self, withObject: "sunshine")

        })

}


func greetings(object: AnyObject?) {

    println("greetings world")

    println("attached object: \(object)")

}

控制臺日志:


問候世界


附加對象:陽光


方法B

這個(gè)替代方法是較早發(fā)現(xiàn)的,我也在設(shè)備和模擬器上進(jìn)行了測試。這個(gè)想法是使用UIControl的以下方法:


func sendAction(_ action: Selector, to target: AnyObject!, forEvent event: UIEvent!)

ViewController中的示例代碼:


override func viewDidLoad() {

    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.


    var control: UIControl = UIControl()

    control.sendAction(Selector("greetings"), to: self, forEvent: nil) // Use dispatch_after to invoke this line as block if delay is intended 

}


func greetings() {

    println("greetings world")

}

控制臺日志:


問候世界


方法C

NSTimer


class func scheduledTimerWithTimeInterval(_ seconds: NSTimeInterval,

                                      target target: AnyObject!,

                                 selector aSelector: Selector,

                                  userInfo userInfo: AnyObject!,

                                    repeats repeats: Bool) -> NSTimer!


查看完整回答
反對 回復(fù) 2019-10-11
?
尚方寶劍之說

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊

按照@JTerry的回答“在Swift中不需要選擇器”,您可以將實(shí)際方法分配給變量。我的解決方案如下(我在方法中需要一個(gè)參數(shù)):


class SettingsMenuItem: NSObject {

    ...

    var tapFunction: ((sender: AnyObject?) -> ())?

}

然后在視圖控制器中,我以這種方式聲明,分配和運(yùn)行該函數(shù):


class SettingsViewController: UITableViewController {


    func editProfile(sender: AnyObject?) {

        ...

    }


    ...


    menuItem.tapFunction = editProfile


    ...


    if let tapFunction = menuItem.tapFunction {

        tapFunction(sender: self)

    }



}


查看完整回答
反對 回復(fù) 2019-10-11
  • 3 回答
  • 0 關(guān)注
  • 973 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號