Swift 协议扩展默认实现与类中的实际实现

高场

考虑以下代码:

protocol MyProtocol {
    static var name: String { get }
}

extension MyProtocol {
    static var name: String {
        return "unnamed"
    }
}

// does not specify its own name
class MyClass: MyProtocol {

}

//specifies its own name!
class MyClass2: MyProtocol {
    static var name: String {
        return "Specific name"
    }
}

let myClass = MyClass()
print("\(MyClass.name)")
//>>"unnamed"

let myClass2 = MyClass2()
print("\(MyClass2.name)")
//>>"Specific name"

swift 是否保证对于具有协议属性的实际实现的类(例如在本例中为 MyClass2),在本例中为“名称”,这是从类中使用的,而不是默认的“名称”实现之一通过协议扩展?

牧羊人大卫

拥有所需协议函数/属性的默认实现意味着您的符合类型不必实现该函数/属性,他们可以使用默认实现。

但是,如果符合类型确实实现了函数/属性,那么编译器将始终调用更具体的实现,即符合类中的实现,而不是默认实现。

因此,即使您将 的实例存储MyClass2在类型为 的变量中MyProtocol,您仍然可以MyClass2在访问变量的属性时获得实现。

let myClass2: MyProtocol = MyClass2()
type(of: myClass2).name // "Specific name"

对于在协议扩展中声明和定义的非必需属性/函数,行为是不同的。如果您仅在协议扩展中声明一个属性/函数,那么即使您在符合标准的类中为其提供不同的实现,您也无法从类型为协议类型而非协议类型的变量访问该实现特定的符合类型。

protocol MyProtocol {
    static var name: String { get }
}

extension MyProtocol {
    static var name: String {
        return "unnamed"
    }

    // Optional protocol requirement
    static var nonRequired: String {
        return "nonRequired"
    }
}

// does not specify its own name
class MyClass: MyProtocol { }

//specifies its own name!
class MyClass2: MyProtocol {
    static var name: String {
        return "Specific name"
    }

    // Specific implementation
    static var nonRequired: String {
        return "Specific"
    }
}

let myClass = MyClass()
MyClass.name

let myClass2: MyProtocol = MyClass2()
type(of: myClass2).name // "Specific name"
type(of: myClass2).nonRequired // "nonRequired"
MyClass2.nonRequired // "Specific"

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift-具有通用超类约束的扩展中的协议默认实现

来自分类Dev

Swift中协议扩展的默认实现不起作用

来自分类Dev

Swift扩展的协议方法的默认实现

来自分类Dev

Swift:在协议扩展中提供默认协议实现

来自分类Dev

在基类中实现Swift协议方法

来自分类Dev

为什么必须通过 Swift 中的扩展来实现协议默认值?

来自分类Dev

Swift:实现协议的类的类型

来自分类Dev

先进的Swift2-V类中的实现协议与Struct中的实现协议

来自分类Dev

可选只读变量的 Swift 协议默认实现

来自分类Dev

Swift类“未实现(objc)协议”

来自分类Dev

获取实现协议swift的类类型

来自分类Dev

Swift:在协议扩展的静态变量中存储协议的实现类型

来自分类Dev

在Swift中实现Objective C协议

来自分类Dev

懒/内联在Swift中实现协议

来自分类Dev

Xcode中的自动实现Swift协议方法

来自分类Dev

在Swift中实现闭包协议

来自分类Dev

在 Swift 中实现 Objective-C 协议

来自分类Dev

如何在swift中调用协议中的默认实现代码?

来自分类Dev

具有相关类型要求和默认实现的Swift协议

来自分类Dev

Swift协议在基类中存在时允许未实现的功能

来自分类Dev

Swift:类型必须实现协议,并且是给定类的子类

来自分类Dev

检查Swift类是否符合协议并实现可选功能?

来自分类Dev

如何实现Swift的Comparable协议?

来自分类Dev

Swift中的协议扩展?

来自分类Dev

在Swift中实现协议中定义的下标时出错

来自分类Dev

在Swift中实现可枚举/集合类

来自分类Dev

在swift类中实现AsyncSocket回调

来自分类Dev

在swift类中实现AsyncSocket回调

来自分类Dev

如何在Swift中实现Singleton类

Related 相关文章

热门标签

归档