在Int扩展上调用mutating func

时间:2014-06-23 00:18:33

标签: swift swift-extensions

在命令行应用中创建扩展程序。当我尝试调用calc方法时,它不会起作用。调用desc工作。

我错过了什么?

protocol Calculatable {
    var desc:String { get }
    mutating func calc()
}

class MyClass : Calculatable {
    var desc:String = "MyClass"
    func calc()  {
        desc += " is great"
    }
}

extension Int: Calculatable {
    var desc:String { return "hi" }
    mutating func calc() {
        self += 10
    }
}

7.desc  // works
7.calc() // Compiler error: could not find member calc

1 个答案:

答案 0 :(得分:5)

那是因为7是常数。如果您首先将其存储在变量中,则可以执行此操作:

var number = 10
number.calc()

注意:您获得的错误不是一个非常好的错误。斯威夫特肯定在这方面有一些工作要做。真正的错误是你试图在一个不可变的实例上调用一个mutating方法

你可以做的是使它成为常规方法并返回一个新值,而不是试图改变自我:

extension Int: Calculatable {
    var desc: String { return "hi" }
    func calc() -> Int {
        return self + 10
    }
}

7.calc() // 17
相关问题