To znaczy, kiedy zadzwonić numberFormatter.stringFromNumber(12345678)
po powyższym kodzie, tak?
let i64: Int64 = 1234567890
numberFormatter.stringFromNumber(i64)
Nie wygląda Swift rzuci z Int64
do 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)
Jest nieco mylących, ponieważ Swift Int
s sami są zwykle takie same wymiary jak Int64
s.
można obejść przez konstruowania NSNumber
ręcznie:
let n64 = NSNumber(longLong: i64)
BTW Pamiętaj, że var
trik: to miłe, że to oddaje cały odpowiedniego kodu do tworzenia numberFormatter
, ale że kod zostanie uruchomiony na nowo za każdym razem, używasz tego. Jako alternatywę można to zrobić:
let numberFormatter: NSNumberFormatter = {
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
Jeśli jest to obiekt w struct/klasy, można również zrobić mu lazy var
która ma dodatkową korzyść tylko jest uruchomiony, jeśli zmienna jest używana, jak Twój var
, ale tylko raz.
struct Thing {
lazy var numberFormatter: NSNumberFormatter = {
println("blah")
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
}
metoda tak longlong wystarczyły dla mnie. – Kashif