如何实例化由扩展完全定义的协议的默认实现

How to instantiate default implementation of Protocol fully defined by Extensions

你能给我解释一下这段代码有什么问题吗?我正在尝试了解协议的默认实现

protocol Person {
  var name: String {get}
  func printName() -> String
}

extension Person {
  var name: String {
    return "Andrea"
  }
}

extension Person {
  func printName() -> String {
      return "\(name) bye bye"
  }
}

struct person: Person {} //correct

person.name  // error

person.printName() // error

您尝试使用不存在的静态方法;改为创建结构实例:

struct Friend: Person {}

let friend = Friend()
print(friend.name)
friend.printName()

您混淆了类型和值。

struct person 是一种新的 类型 采用 Person 协议。

现在您需要定义一个实例。

这应该更清楚:

protocol PersonProtocol {
    var name: String {get}
    func printName() -> String
}

extension PersonProtocol {
    var name: String {
        return "Andrea"
    }
}

extension PersonProtocol {
    func printName() -> String {
        return "\(name) bye bye"
    }
}

struct ConcretePersonType: PersonProtocol { } // correct

var personInstance = ConcretePersonType()

print(personInstance.name)  // No more error!

personInstance.printName() // No more error!

Protocols 不是数据类型。您正在尝试将其用作此行中的数据类型:

struct person: Person {}

相反,您应该使用符合 protocol.

struct/enum/class

对于您的情况,最佳解决方案是使用 struct :

struct PersonStruct: Person {}
let foo = PersonStruct()
print(foo.name)
foo.printName()