Ant*_*tox 19 protocols objective-c swift protocol-extension
是否可以从Objective-C调用Swift中协议扩展中定义的方法?
例如:
protocol Product {
var price:Int { get }
var priceString:String { get }
}
extension Product {
var priceString:String {
get {
return "$\(price)"
}
}
}
class IceCream : Product {
var price:Int {
get {
return 2
}
}
}
Run Code Online (Sandbox Code Playgroud)
实例的价格字符串IceCream是'$ 2'并且可以在Swift中访问,但是该方法在Objective-C中不可见.编译器抛出错误'No visible @interface for'FlowCream'声明选择器......'.
在我的配置中,如果方法是直接在Swift对象的实现中定义的,那么一切都按预期工作.即:
protocol Product {
var price:Int { get }
var priceString:String { get }
}
class IceCream : Product {
var price:Int {
get {
return 2
}
}
var priceString:String {
get {
return "$\(price)"
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*sen 15
我几乎可以肯定这个问题的答案是"不",虽然我还没有找到正式的Apple文档来解释它.
以下是来自swift-evolution邮件列表的消息,讨论了对所有方法调用使用动态调度的提议,这将提供更像Objective-C的调用语义:
同样,唯一的例外是协议扩展.与该语言中的任何其他构造不同,协议扩展方法在虚拟分派会导致不同结果的情况下静态分派.没有编译器错误可以防止这种不匹配.(https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/001707.html)
协议扩展是一种仅限Swift的语言功能,因此不可见objc_msgSend().
| 归档时间: |
|
| 查看次数: |
8144 次 |
| 最近记录: |