我正在学习Swift语言,在github.com上,我找到了SwiftHelper
在它的IntHelper.swift
文件中,我找到了以下代码:
extension Int {
var isEven: Bool {
let remainder = self % 2
return remainder == 0
}
var isOdd: Bool {
return !isEven
}
}
为什么isEven
和isOdd
被写为属性,而不是方法调用?
在这种情况下,使用属性比使用方法调用有任何优势吗?
答案 0 :(得分:2)
纯粹从技术角度来说,使用属性而不是方法没有优点或缺点,反之亦然 * :唯一的区别在于可读性。
在这种特殊情况下,我认为使用扩展属性比使用方法调用具有更好的可读性,因为它读得更好。比较
if myInt.isOdd {
... // Do something
}
VS
if myInt.isOdd() {
... // Do something
}
VS
if isOdd(myInt) {
... // Do something
}
第一个(属性)和第二个(方法)代码片段使单词保持与英语相同的顺序,有助于提高可读性。但是,第二个添加了一对不必要的括号。为了完整起见,完成相同任务(函数)的第三种方法的可读性低于其他两种方法。
* 这也适用于支持属性的其他语言,例如Objective-C和C#。
答案 1 :(得分:0)
扩展程序中使用的属性就是所谓的'计算属性' - 它在很多方面 就像一个方法: )因为他们自己不存储任何状态,而是返回一些计算值。
对于类似这样的事情,实现“属性”与“方法”之间的选择可以用语义术语来思考;在这里,虽然正在计算该值,但它只是用于表示一些关于对象状态的信息(在Int 的情况下,技术上是'struct'),就像你期望一个属性一样,并要求该状态不要求它修改自身或其任何依赖。
就可读性而言,Swift中的方法(即使那些没有参数的方法)仍然需要parens - 你可以看到这个例子中的差异:
// as a property
if 4.isEven { println("all is right in the world") }
// as a method
if 5.isEven() { println("we have a problem") }