当前位置: 首页 > 知识库问答 >
问题:

为什么我不能在SWIFT中使用let in协议?

党宇定
2023-03-14

我对Swift中关于var和关键字{get set}的使用的协议有疑问。

来自Apple文档:

protocol someProtocol 
{
   var someProperty: String { get }
}

这将不是公正的:

protocol someProtocol 
{
   let someProperty: String
}

我错过了什么?

共有1个答案

潘修为
2023-03-14

“只有get的协议中的风险值不仅仅是一个let?”不是。let指示常量。但这里不是这样。考虑以下几点:

protocol SomeProtocol {
    var someProperty: String { get }
}

class SomeClass : SomeProtocol {

    var someProperty: String = ""

    func cla () {
        someProperty = "asd"
    }
}

let someInstance = SomeClass()

print(someInstance.someProperty) // outputs ""
someInstance.cla()
print(someInstance.someProperty) // outputs "asd"

协议指定符合的类向外部显示什么--某个类型为string名为someproperty的属性,您至少可以获得该属性。

如果协议指定{get},您的类可以选择通过let someproperty:String=“”,但它也可以类似地选择通过上面的代码进行一致性。另一方面,如果协议指定{get set},则不能在实现中使用let,而必须使其也可设置。

协议不能简单地定义一个值必须是常量--它也不应该是常量,这是一个必须由实现它的类/结构来处理(或决定)的实现细节。

 类似资料:
  • 问题内容: 我正在尝试通过符合协议的编码模型来获取数据。但是它无法像下面的代码那样调用func : 但是在另一个演示中,效果很好,为什么呢? 问题答案: 解决方案1。 https://github.com/satishVekariya/SVCodable 试试这个代码,它扩展了可编码 解决方案2。 避免污染带有扩展名的Apple提供的协议 用

  • 我正在尝试使用文件系统。我的< code>CMakeLists.txt中有< code>-std=c 11 -std=c 1y。GCC版本为4.9.2。然而,我得到了一个错误: 使用的正确方法是什么?

  • 从TensorArray读取: 使用: 问题: 回溯(最近一次调用last):RLU培训中第130行的文件“\main.py”。train()文件“C:\Users\user\Documents\Projects\rl toolkit\rl_training.py”,第129行,在train self中_rpm,赛尔夫。批量大小,自行确定。梯度步数,记录步数b=self。在call result=

  • 我试图使用Java8Javadoc工具,但它抱怨是一个未知标记: 我看到有一些方法可以禁用doclint,但我真的想知道哪些标签列表被支持(或者为什么这个不支持)。 更多信息在这个问题,这个问题和从这个博文。

  • 我想在spring boot项目中使用“truncate table”语句而不是“delete”语句,因为我需要重置mysql中的自动增量id。这是我的代码: 但有一个例外,就像这样: 其他操作已经工作,如插入、更新或选择,原因是什么,我应该修改什么?

  • 问题内容: 我不是从情节提要中使用a ,而是要有一个自定义函数,可以在其中传递某些对象的。我只想像在Objective- C中一样打电话。像这样: 但是我收到以下编译器错误: 必须调用超类UIViewController的指定初始化程序 我可以不再这样做吗? 问题答案: 对于指定的初始化器是。您应该打电话给它。 参见http://www.bignerdranch.com/blog/real-iph