3 回答
TA贡献2065条经验 获得超14个赞
更新Swift 3语法:
如果您不关心是否存在可选方法,只需调用即可 delegate?.optionalMethod?()
否则,使用guard
可能是最好的方法:
weak var delegate: SomeDelegateWithOptionals?func someMethod() { guard let method = delegate?.optionalMethod else { // optional not implemented alternativeMethod() return } method()}
原始答案:
您可以使用“if let”方法测试这样的可选协议:
weak var delegate: SomeDelegateWithOptionals?func someMethod() { if let delegate = delegate { if let theMethod = delegate.theOptionalProtocolMethod? { theMethod() return } } // Reaching here means the delegate doesn't exist or doesn't respond to the optional method alternativeMethod()}
TA贡献1936条经验 获得超6个赞
如上所述,在Swift中,大多数情况下,您可以使用?可选的unwrapper运算符实现所需的功能。这允许您在对象上调用方法,当且仅当对象存在(而不是nil)并且方法已实现时。
在您仍然需要的情况下respondsToSelector:,它仍然作为NSObject协议的一部分。
如果您respondsToSelector:在Swift 中调用Obj-C类型,那么它的工作方式与您期望的相同。如果您在自己的Swift类中使用它,则需要确保您的类派生自NSObject。
这是一个Swift类的示例,您可以检查它是否响应选择器:
class Worker : NSObject
{
func work() { }
func eat(food: AnyObject) { }
func sleep(hours: Int, minutes: Int) { }
}
let worker = Worker()
let canWork = worker.respondsToSelector(Selector("work")) // true
let canEat = worker.respondsToSelector(Selector("eat:")) // true
let canSleep = worker.respondsToSelector(Selector("sleep:minutes:")) // true
let canQuit = worker.respondsToSelector(Selector("quit")) // false
重要的是不要遗漏参数名称。在这个例子中,Selector("sleep::")是不一样的Selector("sleep:minutes:")。
TA贡献1836条经验 获得超4个赞
没有真正的Swift替代品。
您可以通过以下方式办理登机手续:
someObject.someMethod?()
someMethod
只有在对象上定义了方法,才会调用该方法,someObject
但只能将其用于@objc
已声明方法的协议optional
。
Swift本质上是一种安全的语言,所以每当你调用一个方法时,Swift必须知道方法就在那里。无法进行运行时检查。你不能只对随机对象调用随机方法。
即使在Obj-C中你也应该尽可能避免使用这些东西,因为它与ARC不能很好地结合(ARC会触发警告performSelector:
)。
但是,在检查可用的API时respondsToSelector:
,即使是Swift,如果要处理NSObject
实例,仍然可以使用:
@interface TestA : NSObject- (void)someMethod;@end@implementation TestA//this triggers a warning@end
var a = TestA()if a.respondsToSelector("someMethod") { a.someMethod()}
- 3 回答
- 0 关注
- 2057 浏览
添加回答
举报