如何使用selector:在Swfit中抛出异常的函数

时间:2016-07-28 01:02:40

标签: swift selector nsnotification

我有一个SKScene,它自己是一个名为&#34的通知的观察者。 showPhotoForMoodNotification"使用一个关联的选择器:" eventListenerDidReceiveNotification:" 。

eventListenerDidReceiveNotification被声明为可抛出异常的函数,如下所示:

func eventListenerDidReceiveNotification(notif:NSNotification) throws { }

但我注意到,当SKScene收到通知时,编译器没有关联此" eventListenerDidReceiveNotification"的签名。具有"选择器"的签名的方法在addObserver中调用,看起来像thisL

NSNotificationCenter.defaultCenter().addObserver(self, selector: "eventListenerDidReceiveNotification:", name: "showPhotoForMoodNotification", object: nil)

我得到的错误是这样的: enter image description here

所以,我的猜测是"抛出"方法签名的一部分与"选择器"不兼容。 nsnotification" addObserver"的一部分打电话,因为如果我消除"抛出"部分来自" eventListenerDidReceiveNotification"方法声明,事情有效。

所以我必须在addObserver"选择器"中添加更多内容。部分将此方法描述为抛出异常的方法?

感谢

2 个答案:

答案 0 :(得分:0)

可能的答案here。顺便说一句,在Swift 2.2中(实际上,我不知道你使用的是什么版本),new syntax for selectors是推荐使用它的方法。 (IBAction连接到故事板中的按钮TouchUpInside事件)

实际上,我刚刚测试了这段代码并且有效:

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(test(_:)), name: "TestNotification", object: nil)
}

@objc private func test(notification: NSNotification) throws {
    print("notification")
}

@IBAction private func fireNotification() {
    NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: nil)
}

答案 1 :(得分:0)

IIRC,像

这样的Swift方法
func f(x: T) throws -> U

在Objective C中被视为

- (nullable U *)fWithX:(T *)x error:(NSError **)errorPtr;

因此,您可以尝试在选择器中添加error:部分。

编辑:

func f() throws -> U

变为

- (nullable U *)fAndReturnError:(NSError **)errorPtr;