如何使用选择器:使用在 Swift 中引发异常的函数
Posted
技术标签:
【中文标题】如何使用选择器:使用在 Swift 中引发异常的函数【英文标题】:how to use selector: with function that throws exception in Swfit 【发布时间】:2016-07-28 01:02:40 【问题描述】:我有一个 SKScene,它使自己成为名为“showPhotoForMoodNotification”的通知的观察者,并带有一个名为“eventListenerDidReceiveNotification:”的关联选择器。
eventListenerDidReceiveNotification 被声明为一个可以抛出异常的函数,如下:
func eventListenerDidReceiveNotification(notif:NSNotification) throws
但是我注意到当SKScene接收到通知时,编译器并没有将这个“eventListenerDidReceiveNotification”方法的签名与调用的addObserver中的“selector”的签名相关联,看起来像thisL
NSNotificationCenter.defaultCenter().addObserver(self, selector: "eventListenerDidReceiveNotification:", name: "showPhotoForMoodNotification", object: nil)
我得到的错误是:
所以,我的猜测是方法签名的“抛出”部分与 nsnotification“addObserver”调用的“选择器”部分不兼容,因为如果我从“eventListenerDidReceiveNotification”方法中删除“抛出”部分声明,一切正常。
那么我是否必须在 addObserver “选择器”部分添加更多内容来将此方法描述为引发异常的方法?
谢谢
【问题讨论】:
【参考方案1】:可能的答案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)
【讨论】:
【参考方案2】: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;
【讨论】:
以上是关于如何使用选择器:使用在 Swift 中引发异常的函数的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 uiTableview 滚动应用程序崩溃,它会在 swift 中引发数组索引超出范围异常?
在 Swift 中使用 NSTimer 时发送到类的无法识别的选择器; NSInvalidArgumentException