在swift,var与func中获得价值的首选方法是什么?

时间:2016-09-28 12:19:52

标签: ios swift

在swift中获取价值的首选方式是什么? 使用只读变量

var getString: String? {
    return "Value"
}

或使用函数?

func getString() -> String? {
    return "Value"
}

另外,两者之间是否存在性能差异?

3 个答案:

答案 0 :(得分:4)

在性能方面没有明显差异,请选择可读性:

  1. 当属性的行为类似于变量时,请使用属性。您的示例属于此类别。
  2. 当读取属性更改对象状态时,请使用函数。这包括
    • 行为类似于工厂的属性,即在您访问它们时返回新对象
    • 产生新值的属性,例如随机数生成器
    • 外围读者
    • 输入迭代器
  3. 当然,如果属性是基于一个或多个参数计算的,除了使用函数之外别无选择。

答案 1 :(得分:1)

首先,这些都不是合适的名字。它们不应以get开头。 (对于get前缀,有一些历史可可含义,你不是故意的,所以即使你的意思是“去互联网并检索这些信息”,你也想要使用像{{1}这样的东西。 },但肯定不是你给的情况。)

Swift API Design Guidelines的各个部分都解决了这些问题。首先,属性是属性,无论是存储还是计算。所以设计之间没有区别:

fetch

let someProperty: String?

您不应仅因为计算而更改命名。然后我们可以在指南中看到:

  

其他类型,属性,变量和常量的名称应读作名词。

此外,正如The Swift Programming Language中所述:

  

属性将值与特定的类,结构或枚举相关联。存储的属性将常量和变量值存储为实例的一部分,而计算属性则计算(而不是存储)值。

因此,如果最好将其视为与类型(其“属性”之一)相关联的值,那么它应该是属性(计算或存储)。如果它与类型没有真正“关联”(例如调用者希望此类型从其他地方检索的东西),那么它应该是一种方法。再次来自设计指南:

  

记录任何非O(1)的计算属性的复杂性。人们通常认为属性访问不涉及重要的计算,因为他们将属性存储为心理模型。当可能违反该假设时,请务必提醒他们。

如果“存储的属性作为心理模型”与您要表达的内容不符,那么它可能不应该是首先属性(如果您将其作为属性,则需要记录差异)。因此,例如,访问属性通常应该没有可见的副作用。如果你在写完之后立即从一个属性读取,你应该回到你写的价值(再次,作为一般的心理模型而不涉及多线程编程的杂草)。

如果使用方法,通常会产生不同的适当名称。有关详细信息,请参阅设计指南中的“努力流畅使用”部分。选择好的方法名称有几个规则。作为何时使用属性与方法的一个很好的示例,请考虑var someProperty: String? { return "string" } x.makeIterator()i.successor()示例,并考虑为什么这些是方法以及为什么它们按原样命名。这并不是说在所有情况下都有一个答案,但设计指南将为您提供Swift团队的意图。

答案 2 :(得分:0)

就像注意:如果你想在Swift中同时使用getter和setter,你可以这样做:

var myString: String {
     get {
         return "My string"
     }
     set {
          self.myPrivateString = newValue
     }
}

通过这种方式,您可以像访问常规变量一样访问您的值,但是您可以做一些"引擎盖下的魔法"在你的getter和setter中