Swift3迁移后第三行代码报错:Nil与预期类型'Selector'不兼容
Swift3迁移中Selector不能传nil的解决方案
嗨,这个问题我太熟了!Swift 3发布时对Selector的类型做了严格调整,直接导致原来能传nil的代码现在报错——因为Selector在Swift3里不再是可选类型了,它要求必须传入一个有效的选择器,nil自然就不兼容啦。
给你几个实用的解决思路,按需选择就行:
用空的@objc方法代替nil
如果你的场景是需要一个“什么都不做”的选择器,那就定义一个空的Objective-C兼容方法,再用它的选择器替代nil。比如:// 先定义空方法 @objc func emptyAction() {} // 替换原来传nil的地方 yourButton.addTarget(self, action: #selector(emptyAction), for: .touchUpInside)注意方法必须加
@objc,不然Swift生成的方法无法被Selector识别。调整自定义方法的参数类型
如果是你自己写的方法接受Selector参数,原来允许传nil,那可以把参数类型改成Selector?(可选类型),这样就能继续传nil了:// 修改前:func handleAction(action: Selector) // 修改后: func handleAction(action: Selector?) { // 你的逻辑代码,比如判断action是否为nil再处理 if let action = action { perform(action) } }检查API是否有可选Selector的重载版本
有些UIKit或系统框架的方法,可能同时提供了接受Selector和Selector?的重载。如果你的代码是调用系统API报错,先看看有没有可选参数的版本,调用那个就行。不过大部分情况下,系统API的Selector参数在Swift3里都是非可选的,所以还是优先用第一个方法。
举个真实场景的例子:原来Swift2里你可能写过button.addTarget(self, action: nil, forControlEvents: .TouchUpInside),到Swift3里就会报你遇到的错误,这时候换成上面的空方法选择器就搞定了。
内容的提问来源于stack exchange,提问作者Motivation gym5
相关产品推荐
相关产品推荐

