在swift中获取价值的首选方式是什么? 使用只读变量
var getString: String? {
return "Value"
}
或使用函数?
func getString() -> String? {
return "Value"
}
另外,两者之间是否存在性能差异?
答案 0 :(得分:4)
在性能方面没有明显差异,请选择可读性:
当然,如果属性是基于一个或多个参数计算的,除了使用函数之外别无选择。
答案 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中