Bạn có nghĩa là khi bạn gọi numberFormatter.stringFromNumber(12345678)
sau khi mã trên, như thế này?
let i64: Int64 = 1234567890
numberFormatter.stringFromNumber(i64)
Không giống như Swift sẽ được đúc từ một Int64
một 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)
Đây là một chút nhiễu, vì Swift Int
s là mình thường cùng kích thước như Int64
s.
Bạn có thể làm việc xung quanh nó bằng cách xây dựng một NSNumber
bằng tay:
let n64 = NSNumber(longLong: i64)
BTW hãy cẩn thận rằng var
lừa: nó đẹp mà nó gói gọn tất cả các mã có liên quan để tạo numberFormatter
, nhưng code mà sẽ chạy lại từ đầu mỗi khi bạn sử dụng nó. Là một thay thế bạn có thể làm điều này:
let numberFormatter: NSNumberFormatter = {
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
Nếu đó là một tài sản trong một struct/lớp, bạn cũng có thể làm cho nó một lazy var
trong đó có lợi ích bổ sung chỉ là chạy nếu biến được sử dụng, như var
của bạn , nhưng chỉ một lần.
struct Thing {
lazy var numberFormatter: NSNumberFormatter = {
println("blah")
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
}
Nguồn
2015-01-01 17:56:42
phương pháp có Longlong đã làm các trick cho tôi. – Kashif