5

在命令行应用程序中创建了一个扩展。当我尝试调用 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
4

1 回答 1

5

那是因为7是一个常数。如果您首先将其存储在变量中,则可以这样做:

var number = 10
number.calc()

注意:您得到的错误不是一个很好的错误。Swift 在这方面肯定有一些工作要做。真正的错误是您试图在不可变实例上调用变异方法

您可以做的是使其成为常规方法并返回一个新值,而不是尝试改变自身:

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

7.calc() // 17
于 2014-06-23T00:21:28.770 回答