为什么不使用方法调用而不是使用属性?

时间:2014-07-01 10:52:22

标签: swift

我正在学习Swift语言,在github.com上,我找到了SwiftHelper 在它的IntHelper.swift文件中,我找到了以下代码:

extension Int {  
    var isEven: Bool {  
        let remainder = self % 2  
        return remainder == 0  
    }  

    var isOdd: Bool {  
        return !isEven  
    }
}  

为什么isEvenisOdd被写为属性,而不是方法调用?

在这种情况下,使用属性比使用方法调用有任何优势吗?

2 个答案:

答案 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") }