当前位置: 首页 > 面试题库 >

Swift中计算的只读属性vs函数

段恩
2023-03-14
问题内容

在Swift WWDC简介会话中,展示了一个只读属性description

class Vehicle {
    var numberOfWheels = 0
    var description: String {
        return "\(numberOfWheels) wheels"
    }
}

let vehicle = Vehicle()
println(vehicle.description)

选择上述方法而不是使用方法有什么含义:

class Vehicle {
    var numberOfWheels = 0
    func description() -> String {
        return "\(numberOfWheels) wheels"
    }
}

let vehicle = Vehicle()
println(vehicle.description())

在我看来,您选择只读计算属性的最明显原因是:

  • 语义 -在此示例中description,将其作为类的属性而不是其执行的操作是有意义的。
  • 简短明了 -避免在获取值时使用空括号。

显然,上面的示例过于简单,但是否有其他充分的理由选择一个?例如,是否有一些功能或属性的功能可以指导您决定使用哪种功能?

注意:乍看之下,这似乎是一个非常普遍的OOP问题,但我很想知道任何特定于Swift的功能,这些功能将指导使用该语言的最佳实践。


问题答案:

在我看来,这主要是风格问题:我非常喜欢将 属性 用于:表示您可以获取和/或设置的简单值。当实际工作完成时,我使用 函数
(或方法)。也许必须从磁盘或数据库中计算或读取某些内容:在这种情况下,即使仅返回一个简单值,我也使用一个函数。这样一来,我可以轻松地看到呼叫是廉价的(属性)还是可能昂贵的(功能)。

当苹果发布一些Swift编码约定时,我们可能会变得更加清晰。



 类似资料:
  • 问题内容: 在Swift中,定义公共模式的常规方式是什么,在该模式中,属性是外部只读的,但可以由拥有该属性的类(和子类)在内部进行修改。 在Objective-C中,有以下选项: 在接口中将该属性声明为只读,并使用类扩展名在内部访问该属性。这是基于消息的访问,因此可以很好地与KVO,原子性等配合使用。 在接口中将该属性声明为只读,但在内部访问后备ivar。由于对ivar的默认访问受到保护,因此在类

  • 问题内容: 我不知道何时属性应该是私有的,是否应该使用属性。 我最近读到,setter和getters不是pythonic,我应该使用属性装饰器。没关系。 但是,如果我有属性,那一定不能从类外部设置,而是可以读取的(只读属性)。这个属性应该是私有的吗?我所说的私有是指下划线吗?如果是,那么不使用getter怎么读?我现在知道的唯一方法是写 这样我就可以读取属性,但是我无法设置它,所以很好。 但是我

  • 问题内容: 对于上述代码,快速二进制文件抱怨“未处理错误,因为未将封闭函数声明为” throws”。 我如何在上面声明“ someProperty”“抛出”? 和 和 似乎不起作用。 问题答案: Swift 5更新:仍然不可能。 从Swift 3开始: 您不能从计算的属性中抛出。如果要抛出,必须使用一个函数。Swift编程语言末尾的“ 语言参考”部分的“声明”部分仅列出(和)作为函数和初始化声明的

  • 我正在尝试实现这个objective-c代码 为什么我要使用这个?CustView从很多地方调用,所以我们必须在所有地方检查这个条件。为了避免这种重复,我写了这个。 所以我尝试创建存储的属性,并使用getter方法检查是否已经创建。 这是正确的吗?或者其他方法来做这件事? 注意:上面的代码没有警告或错误。但是与存储和计算的属性混淆。请让我明白。

  • 问题内容: 鉴于Python的动态性,如果无法实现,我会感到震惊: 我想更改的实现。 我试图简单地写成这样: 但这告诉我。 这是防止我做可能(可能)愚蠢的事情的好尝试,但是我真的很想继续做下去。我怀疑解释器有某种可以修改的查找表,但我在Google上找不到类似的表。也不起作用- 它返回了与只读属性完全相同的错误。 我很想寻找一个Python 2.7解决方案,如果那很重要的话,尽管没有理由拒绝抛出适

  • 主要内容:实例 1,实例 2,computed vs methods,实例 3,computed setter,实例 4计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1 <div id="app"> {{ message.split('').reverse().join('') }} </div> 实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2 <div id="app">