如何将anObject respondsToSelector:@selector(stringValue)]转换为swift3

时间:2017-11-24 20:43:28

标签: swift

如何将responsetoselector转换为swift3。如果我转换为响应的静态方法调用错误(至:)

- (NSString *)stringForObjectValue:(id)anObject { 
     if ([anObject respondsToSelector:@selector(stringValue)])
     { 
        return [anObject stringValue]; 
     } 
   }

1 个答案:

答案 0 :(得分:0)

在Swift中,不是检查类是否响应选择器,而是使用可选链接来调用方法:

func stringForObjectValue(anObject: AnyObject) -> String? {
    return anObject.stringValue?()
}

请注意,该方法必须是Objective-C运行时可用的方法。因此,如果您为自己的班级实施stringValue,则需要先加@objc

class Foo {
    @objc func stringValue() -> String {
        return "Foo baby"
    }
}

class Bar {
    // It works with properties too
    @objc var stringValue = "Bar bar Jinx"
}

class Baz {
    // This method not available to Objective-C
    func stringValue() -> String {
        return "Baz Baz bo Baz"
    }
}

stringForObjectValue(anObject: Foo())  // "Foo baby"
stringForObjectValue(anObject: Bar())  // "Bar bar Jinx"
stringForObjectValue(anObject: Baz())  // nil

有关详细信息,请参阅AnyObject,尤其是标题为"访问Objective-C方法和属性" 的部分。