Вы имеете в виду, когда вы звоните numberFormatter.stringFromNumber(12345678)
после приведенного выше кода, как это?
let i64: Int64 = 1234567890
numberFormatter.stringFromNumber(i64)
Непохоже, Swift будет отлита из Int64
к NSNumber
:
let i = 1234567890
let n = i as NSNumber // OK
numberFormatter.stringFromNumber(i) // Also OK
// Compiler error: 'Int64' is not convertible to 'NSNumber'
let n64 = i64 as NSNumber
// so the implicit conversion will also fail:
numberFormatter.stringFromNumber(i64)
Это немного озадачив, так как Swift Int
s сами, как правило, такой же размер, как Int64
с.
Вы можете работать вокруг него, построив NSNumber
вручную:
let n64 = NSNumber(longLong: i64)
BTW остерегаться, что var
трюка: это хорошо, что он инкапсулирует весь необходимый код для создания numberFormatter
, но этот код будет работать заново каждый раз, когда вы используете его. В качестве альтернативы вы можете сделать это:
let numberFormatter: NSNumberFormatter = {
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
Если это свойство в STRUCT/классе, вы можете также сделать его lazy var
, который имеет дополнительное преимущество, только будучи запущен, если используется переменная, как ваш var
, но только один раз.
struct Thing {
lazy var numberFormatter: NSNumberFormatter = {
println("blah")
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
}
метод да Лунлун сделал трюк для меня. – Kashif