【问题标题】:What is the preferred way of getting value in swift, var vs. func?在 swift、var 和 func 中获得价值的首选方式是什么?
【发布时间】:2016-09-28 12:19:51
【问题描述】:

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

var getString: String? {
    return "Value"
}

还是使用函数?

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

另外,两者之间有性能差异吗?

【问题讨论】:

  • 没有官方推荐。我个人有这个规则:如果它需要参数,它应该是一个函数/方法,否则它应该是一个属性。反正性能是一样的。
  • @EricAya 如果它需要参数,它必须是一个函数/方法 ;-)

标签: ios swift


【解决方案1】:

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

  1. 当属性的行为类似于变量时,请使用属性。您的示例属于此类。
  2. 当读取属性改变对象状态时,使用函数。这包括
    • 行为类似于工厂的属性,即当您访问它们时返回新对象
    • 产生新值的属性,例如随机数生成器
    • 外围阅读器
    • 输入迭代器

当然,如果属性是基于一个或多个参数计算的,你别无选择,只能使用函数。

【讨论】:

  • 那些以某种方式依赖于其他内部类成员的属性(例如类Temperature,属性为CFK)呢?
  • @brigadir 只要多次连续调用的结果不改变只要你之间不操纵其他属性,这应该是一个属性。
【解决方案2】:

首先,这些都不是合适的名称。它们不应以get 开头。 (get 前缀在历史上的 Cocoa 含义并不是您的意思,因此即使您的意思是“上网并检索此信息”,您也想使用类似 fetch 的东西,但当然不是你给出的情况。)

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

let someProperty: String?

var someProperty: String? { return "string" }

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

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

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

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

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

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

如果“作为心智模型存储的属性”与您要表达的意思不匹配,那么它可能一开始就不应该是属性(如果您将其设为属性,则需要记录差异)。因此,例如,访问属性通常应该没有可见的副作用。如果您在写入属性后立即读取它,您应该取回您写入的值(同样,作为一个通用的心智模型,无需陷入多线程编程的杂草)。

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

【讨论】:

    【解决方案3】:

    请注意:如果您想在 Swift 中同时使用 getter 和 setter,您可以执行以下操作:

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

    通过这种方式,您可以像访问常规变量一样访问您的值,但您可以在 getter 和 setter 中执行一些“幕后魔术”

    【讨论】:

    • 如果没有set { },就不需要写get { }。 OP 的语法是正确的,因为它们没有指定 set { }
    • 是的,我误读了这个问题。我正在编辑我的答案(也许可以帮助其他人)。
    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多