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

什么是快速获得价值的首选方式? 使用只读variables

var getString: String? { return "Value" } 

或使用function?

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

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

没有明显的性能差异,请select可读性:

  1. 当一个属性的行为像一个variables,使用一个属性。 你的例子属于这个类别。
  2. 当读取一个属性改变对象状态时,使用一个函数。 这包括
    • 行为类似于工厂的属性,即在访问它们时返回新的对象
    • 生成新值的属性,如随机数生成器
    • 外围阅读器
    • input迭代器

当然,如果这个属性是根据一个或多个参数来计算的,那么除了使用一个函数之外别无select。

首先,这些都不是合适的名字。 他们不应该开始get 。 (对于一个get prefix来说,历史上cocoa的含义并不意味着,所以即使你的意思是“走出去上网并获取这些信息”,你也会想要使用类似fetch东西,但是肯定不是这样的你已经给了。)

这些问题在Swift APIdevise指南的各个部分中得到解决。 首先,财产是财产,无论是存储还是计算。 所以在devise之间没有区别:

 let someProperty: String? 

 var someProperty: String? { return "string" } 

你不应该因为它的计算而改变命名。 我们可以在指南中看到:

其他types,属性,variables和常量的名称应该作为名词来读取。

此外,正如“Swift编程语言 :

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

因此,如果最好把它看作与types(其中一个“属性”)相关的值,那么它应该是一个属性(计算或存储)。 如果它不是与types真正“关联”的东西(调用者希望这个types从别处检索的东西),那么它应该是一个方法。 再次从devise指南:

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

如果“存储的属性作为一种心理模型”与你所expression的意思不符,那么它可能不应该是一个财产(如果你把它作为一个财产,你需要logging差异)。 所以,例如,访问一个属性通常应该没有明显的副作用。 如果你在写完一篇文章之后立即从某个属性读取数据,那么你应该重新获得你所写的价值(再一次,作为一个普通的心理模型,而不会陷入multithreading编程的困境)。

如果使用方法,通常可能导致不同的适当名称。 有关更多信息,请参阅devise指南中的“努力达到stream利使用”一节。 有几个select好方法名称的规则。 作为什么时候使用属性与方法的一个很好的例子,考虑x.makeIterator()i.successor()x.sorted()例子,并思考为什么这些是方法以及为什么它们被命名。 这并不是说在所有情况下都只有一个答案,但是devise指南将给你提供Swift团队打算的例子。

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

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

这样,你可以像访问常规variables一样访问你的价值,但是你可以在你的getters和setters中做一些“底层魔法”