我在谷歌上搜索了一下,但没有找到与respondsToSelector:等价的swift:是什么。
这是我唯一能找到的(Swift替代respondsToSelector),但在我的情况下并不太相关,因为它检查委托的存在,我没有委托,我只是想检查在设备上运行时是否存在新的API,如果没有回落到API的以前版本。
我在谷歌上搜索了一下,但没有找到与respondsToSelector:等价的swift:是什么。
这是我唯一能找到的(Swift替代respondsToSelector),但在我的情况下并不太相关,因为它检查委托的存在,我没有委托,我只是想检查在设备上运行时是否存在新的API,如果没有回落到API的以前版本。
当前回答
我使用guard let else,如果委托func没有实现,它可以做一些默认的事情。
@objc protocol ViewController2Delegate: NSObjectProtocol {
optional func viewController2(controller: ViewController2, didSomethingWithStringAndReturnVoid string: String)
optional func viewController2(controller: ViewController2, didSomethingWithStringAndReturnString string: String) -> String
}
class ViewController2: UIViewController {
weak var delegate: ViewController2Delegate?
@IBAction func onVoidButtonClicked(sender: AnyObject){
if (delegate != nil && delegate!.respondsToSelector(Selector("viewController2:didSomethingWithStringAndReturnVoid:"))) {
NSLog("ReturnVoid is implemented")
delegate!.viewController2!(self, didSomethingWithStringAndReturnVoid: "dummy")
}
else{
NSLog("ReturnVoid is not implemented")
// Do something by default
}
}
@IBAction func onStringButtonClicked(sender: AnyObject){
guard let result = delegate?.viewController2?(self, didSomethingWithStringAndReturnString: "dummy") else {
NSLog("ReturnString is not implemented")
// Do something by default
return
}
NSLog("ReturnString is implemented with result: \(result)")
}
}
其他回答
等价的是?接线员:
var value: NSNumber? = myQuestionableObject?.importantMethod()
importantMethod只在myQuestionableObject存在并实现它时才会被调用。
没有真正的Swift替代品。
您可以通过以下方式进行检查:
someObject.someMethod?()
只有当someemethod方法定义在对象someObject上时,才会调用它,但你只能将它用于已声明该方法为可选的@objc协议。
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()
}
对于swift 3.0
import UIKit
@objc protocol ADelegate : NSObjectProtocol {
@objc optional func hi1()
@objc optional func hi2(message1:String, message2:String)
}
class SomeObject : NSObject {
weak var delegate:ADelegate?
func run() {
// single method
if let methodHi1 = delegate?.hi1 {
methodHi1()
} else {
print("fail h1")
}
// multiple parameters
if let methodHi2 = delegate?.hi2 {
methodHi2("superman", "batman")
} else {
print("fail h2")
}
}
}
class ViewController: UIViewController, ADelegate {
let someObject = SomeObject()
override func viewDidLoad() {
super.viewDidLoad()
someObject.delegate = self
someObject.run()
}
// MARK: ADelegate
func hi1() {
print("Hi")
}
func hi2(message1: String, message2: String) {
print("Hi \(message1) \(message2)")
}
}
目前(Swift 2.1)你可以用3种方式检查它:
使用respondsToSelector由@Erik_at_Digit回答 使用的?@Sulthan回答道 用as?接线员: if let delegateMe = self.delegate as?YourCustomViewController { delegateMe.onSuccess () }
基本上,这取决于你想要达到的目标:
例如,如果你的应用程序逻辑需要执行一些操作,委托没有设置或指向委托没有实现onSuccess()方法(协议方法),那么选项1和3是最好的选择,尽管我会使用选项3,这是Swift的方式。 如果你不想在委派为nil或方法没有实现时做任何事情,那么使用选项2。
我使用guard let else,如果委托func没有实现,它可以做一些默认的事情。
@objc protocol ViewController2Delegate: NSObjectProtocol {
optional func viewController2(controller: ViewController2, didSomethingWithStringAndReturnVoid string: String)
optional func viewController2(controller: ViewController2, didSomethingWithStringAndReturnString string: String) -> String
}
class ViewController2: UIViewController {
weak var delegate: ViewController2Delegate?
@IBAction func onVoidButtonClicked(sender: AnyObject){
if (delegate != nil && delegate!.respondsToSelector(Selector("viewController2:didSomethingWithStringAndReturnVoid:"))) {
NSLog("ReturnVoid is implemented")
delegate!.viewController2!(self, didSomethingWithStringAndReturnVoid: "dummy")
}
else{
NSLog("ReturnVoid is not implemented")
// Do something by default
}
}
@IBAction func onStringButtonClicked(sender: AnyObject){
guard let result = delegate?.viewController2?(self, didSomethingWithStringAndReturnString: "dummy") else {
NSLog("ReturnString is not implemented")
// Do something by default
return
}
NSLog("ReturnString is implemented with result: \(result)")
}
}