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 的实例,您就可以访问其属性和方法。