可以在Objective-c中访问的协议的扩展上定义Swift方法

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().