不能在不可变值 Swift 上使用可变成员

Evg*_*ban 1 swift

我想写一个扩展,Double这样它 func 就会给出Int值。

extension Double {
  func toPercentage() -> Int {
    var mutableSelf = self
    var twoDigits = Double(round(1000*mutableSelf)/1000)
    return Int(twoDigits) * 100
  }
}
Run Code Online (Sandbox Code Playgroud)

在线var twoDigits = Double(round(1000*mutableSelf)/1000)编译器抛出红色 - Cannot use mutating member on immutable value: 'self' is immutable

但我确实将 self 重新分配给mutableSelf变量。Double 是结构体,不是引用类型,为什么会出现错误?

Mar*_*n R 5

由于您处于 的扩展名中Double,编译器推断 round()为 的mutating func round()方法Double,即使调用与其签名不匹配。此行为已报告为错误:

您可以参考全局 C 库函数

extension Double {
    func toPercentage() -> Int {
        let twoDigits = Darwin.round(1000*self)/1000
        return Int(twoDigits * 100)
    }
}
Run Code Online (Sandbox Code Playgroud)

或者更好,使用以下Double.rounded()方法:

extension Double {
    func toPercentage() -> Int {
        let twoDigits = (1000*self).rounded()/1000
        return Int(twoDigits * 100)
    }
}
Run Code Online (Sandbox Code Playgroud)

或者干脆

extension Double {
    func toPercentage() -> Int {
        return Int((100 * self).rounded())
    }
}
Run Code Online (Sandbox Code Playgroud)