Xcode 8 Beta 4 Swift 3 - изменилось поведение "круглого"

У меня есть следующее простое расширение для Double, которое отлично работает во всем, вплоть до Xcode 8 beta 3

public extension Double {
    public func roundTo(_ decimalPlaces: Int) -> Double {
        var v = self
        var divisor = 1.0
        if decimalPlaces > 0 {
            for _ in 1 ... decimalPlaces {
                v *= 10.0
                divisor *= 0.1
            }
        }
        return round(v) * divisor
    }
}

Начиная с Beta 4, я получаю: "Нельзя использовать мутирующий элемент в неизменяемом значении:" self "неизменен" в функции round в возврате - есть ли у кого какие-либо подсказки?

Ответы

Ответ 1

Это связано с конфликтом имен с новыми функциями округления в протоколе FloatingPoint, round() и rounded(), которые были добавлены в Swift 3 с Xcode 8 beta 4.

Таким образом, вам также необходимо устранить ошибку, указав, что вы ссылаетесь на глобальную функцию round() в модуле Darwin:

return Darwin.round(v) * divisor

Или, что еще лучше, просто используйте новые функции округления и вызовите rounded() на v:

return v.rounded() * divisor