如何实例化由扩展完全定义的协议的默认实现
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()
你能给我解释一下这段代码有什么问题吗?我正在尝试了解协议的默认实现
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()