在swift中,var vs. func获取值的首选方式是什么?



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

var getString: String? {
    return "Value"
}

还是使用函数?

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

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

首先,这两个名字都不合适。它们不应该以get开头。(有一个get前缀的历史可可的意思,你不意味着,所以即使你的意思是"出去到互联网上检索这个信息",你会想要使用像fetch,但肯定不是在你已经给出的情况下。)

这些问题在Swift API设计指南的各个章节中都有解决。首先,属性就是属性,无论它是存储的还是计算的。所以在设计上没有区别:

let someProperty: String?

var someProperty: String? { return "string" }

你不应该仅仅因为它是计算过的就改变它的命名。我们可以在指导方针中看到:

其他类型、属性、变量和常量的名字应该读作名词。

此外,正如在Swift编程语言中所讨论的:

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

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

记录任何非0(1)的计算属性的复杂性。人们通常认为属性访问不涉及重要的计算,因为他们已经将属性存储为心智模型。当这种假设可能被违反时,一定要提醒他们。

如果"作为心理模型存储的属性"与您想要表达的内容不匹配,那么它可能首先就不应该是属性(如果您将其作为属性,则需要记录差异)。因此,例如,访问属性通常应该没有可见的副作用。如果在写入属性后立即从属性中读取,则应该返回所写入的值(同样,这是一种通用的心智模型,不会陷入多线程编程的困境)。

如果您使用一个方法,它通常会导致不同的适当名称。请参阅设计指南的"争取流畅使用"部分了解更多信息。选择好的方法名有几个规则。作为何时使用属性与方法的一个很好的例子,考虑x.makeIterator(), i.successor()x.sorted()的例子,并思考为什么这些是方法以及为什么它们被命名为它们。这并不是说在所有情况下都有一个答案,但是设计指南会给你一些Swift团队想要的例子。

在性能没有明显差异的情况下,选择可读性:

  1. 当一个属性表现得像一个变量时,使用属性。你的例子就属于这一类。
  2. 当读取属性改变对象状态时,使用函数。这包括
    • 行为像工厂的属性,即当你访问它们时返回新对象
    • 产生新值的属性,如随机数生成器
    • <
    • 外围读者/gh>输入迭代器

当然,如果属性是基于一个或多个参数计算的,那么除了使用函数之外别无选择。

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

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

这样你就可以像访问常规变量一样访问你的值,但是你可以在getter和setter

中做一些"幕后的魔术"。

最新更新