如何使用选择器:使用在 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 中使用选择器视图值?

在 Swift 中使用 NSTimer 时发送到类的无法识别的选择器; NSInvalidArgumentException

Python:异常装饰器。如何保留堆栈跟踪

使用 Nimble 测试在 Quick 中引发错误的方法时出错

Swift 通过测试用例访问应用委托引发 swift_dynamiccast 无条件异常