首页 > 解决方案 > 从协议扩展中调用类属性

问题描述

在将协议扩展用于默认实现时,我遇到了一个问题。我定义了一个具有不同可选属性和要使用的功能的协议。在扩展中,我实现了一个默认函数和 nil 属性。在实现中,我使用协议中的属性和函数。

在设备上它按我的预期工作。同样在调试器上,当我在扩展实现中遇到断点时,它给了我类的属性。

有人可以帮我弄清楚为什么我没有从类中获取示例中的属性,而是从扩展中获取 nil 属性。

操场上的例子

import UIKit

protocol Collectable {

    var item: String?  { get }
    func collect()
}

extension Collectable {
    var item: String?  { return nil }
    func collect() {
        if let some = item {
            print("collect \(some)")
        } else {
            print("nothing")
        }
    }
}

class Car: Collectable {
    var item = "letter"
}

let car = Car()
car.collect()

标签: iosswiftprotocols

解决方案


在协议中,您的 item 是可选字符串,而在您的类中,您声明了另一个名为 item 的变量。您的 collect 函数正在寻找可选项目,并且在您指定它应该返回 nil 的扩展中。


推荐阅读