Swift - 类型等于协议的变量
Swift - variable with type equal to protocol
如果我:
1. 创建协议。
2. 创建一个符合上述协议的class。
3.实例化说class。
4. 为所述实例创建一个新变量 =,使该变量的类型 = 为协议。
为什么说新变量只能执行协议功能而不能执行属于class的任何其他功能?
考虑以下因素:
protocol SomeProtocol {
func doSomething()
}
class ClassOne: SomeProtocol {
func doSomething(){
print("did something!")
}
func myStuff(){
print("I'm not a part of the protocol")
}
}
class ClassTwo: SomeProtocol {
func doSomething(){
print("did something too!")
}
func otherStuff(){
print("I do other stuff that's not part of the protocol")
}
}
var a: SomeProtocol = ClassOne()
a.doSomething()
//a.myStuff() //this will not compile
(a as? ClassOne)?.myStuff() //this compiles and will execute
a = ClassTwo()
a.doSomething() //this works too
(a as? ClassOne)?.myStuff() //compiles but cast will fail at runtime, so func doesn't execute
(a as? ClassTwo)?.otherStuff() //executes
执行时,会输出:
did something!
I'm not a part of the protocol
did something too!
I do other stuff that's not part of the protocol
基本上,如果您声明变量只需要符合协议,就没有什么可以阻止您分配一个不同的 class 的实例,只要它符合协议。
正如您在上面看到的,您可以在需要时将其转换为适当的 class,并且只要它是 class 的实例,您就可以访问其属性和方法。
如果我: 1. 创建协议。 2. 创建一个符合上述协议的class。 3.实例化说class。 4. 为所述实例创建一个新变量 =,使该变量的类型 = 为协议。
为什么说新变量只能执行协议功能而不能执行属于class的任何其他功能?
考虑以下因素:
protocol SomeProtocol {
func doSomething()
}
class ClassOne: SomeProtocol {
func doSomething(){
print("did something!")
}
func myStuff(){
print("I'm not a part of the protocol")
}
}
class ClassTwo: SomeProtocol {
func doSomething(){
print("did something too!")
}
func otherStuff(){
print("I do other stuff that's not part of the protocol")
}
}
var a: SomeProtocol = ClassOne()
a.doSomething()
//a.myStuff() //this will not compile
(a as? ClassOne)?.myStuff() //this compiles and will execute
a = ClassTwo()
a.doSomething() //this works too
(a as? ClassOne)?.myStuff() //compiles but cast will fail at runtime, so func doesn't execute
(a as? ClassTwo)?.otherStuff() //executes
执行时,会输出:
did something!
I'm not a part of the protocol
did something too!
I do other stuff that's not part of the protocol
基本上,如果您声明变量只需要符合协议,就没有什么可以阻止您分配一个不同的 class 的实例,只要它符合协议。 正如您在上面看到的,您可以在需要时将其转换为适当的 class,并且只要它是 class 的实例,您就可以访问其属性和方法。