在swift中引用通知块中的self

时间:2015-03-26 20:04:57

标签: swift notifications block

因为我错误地选择了一个选择器名称,所以我想我会尝试使用块而不是选择器来做一些通知。

我已经汇总了一些似乎无法运作的示例代码,因为我无法访问自己

var currentString : String?

// Type alias the notificaitonBlock
typealias notificationBlock = (NSNotification?) -> ()

// in this case note is an NSNotification?
let strNotification : notificationBlock = { notification in
    if let msg = notification?.object as? String {
        self.currentString = msg
    }
}

假设此代码有效,我会将其注册为:

nc.addObserverForName(UIDeviceOrientationDidChangeNotification, 
    object: self, 
    queue: NSOperationQueue.currentQueue(), 
    usingBlock: strNotification)

Xcode给了我以下错误:

NotificationTests.swift:49:4:' NotificationTests - > () - > NotificationTests'没有名为' currentString'

的成员

这意味着自我不是指向班级,而是指向街区或什么?

1 个答案:

答案 0 :(得分:1)

您可以在为块使用实例变量时使用它:

lazy var block: (NSNotification?) -> () = { notification in
    if let msg = notification?.object as? String {
        self.currentString = msg
    }
}

或在方法调用中:

func registerObeserver() {
    NSNotificationCenter.defaultCenter().addObserverForName(UIDeviceOrientationDidChangeNotification, object: self, queue: NSOperationQueue.currentQueue(), { notification in
        if let msg = notification?.object as? String {
            self.currentString = msg
        }
    })
}

正如Martin R在评论中提到的那样,这可能与一个类的一个属性有关,取决于另一个属性在初始化期间

与javascript不同,self在封闭内部不会改变