Нельзя использовать мутирующий член неизменяемого значения Swift - PullRequest
1 голос
/ 09 июля 2019

Я хочу написать расширение для Double, чтобы оно выдавало Int значения.

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

В строке var twoDigits = Double(round(1000*mutableSelf)/1000) компилятор выбрасывает красный - Cannot use mutating member on immutable value: 'self' is immutable

Ноя переназначил себя на mutableSelf переменную.Double - это структура, и это не ссылочный тип, почему появляется ошибка?

Ответы [ 2 ]

3 голосов
/ 09 июля 2019

Поскольку вы используете расширение Double, компилятор выводит round() как mutating func round() метод Double, хотя вызов не соответствует его сигнатуре.Это поведение было сообщено как ошибка:

Вы можете ссылаться на функцию глобальной библиотеки C с

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

или лучше,используйте метод Double.rounded():

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

или просто

extension Double {
    func toPercentage() -> Int {
        return Int((100 * self).rounded())
    }
}
1 голос
/ 09 июля 2019
extension Double {
    func toPercentage() -> Int {
        let twoDigits = Double((1000 * self / 1000).rounded())
        return Int(twoDigits) * 100
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...