2015-01-01 17 views
7

Bin kodunu ayırmak için aşağıdaki kodu başarıyla kullandım. Ancak benim şimdiki proje Int64 aynı şekilde biçimlendirilmiş olması gerekli ve hatası 'Int64' atar dönüştürülebilir değil 'NSNumber'Bin ayırıcılar ile Int64 formatı

var numberFormatter: NSNumberFormatter { 
    let formattedNumber = NSNumberFormatter() 
    formattedNumber.numberStyle = .DecimalStyle 
    formattedNumber.maximumFractionDigits = 0 
    return formattedNumber 
} 

cevap

7

böyle, yukarıdaki kodundan sonra numberFormatter.stringFromNumber(12345678) çağırdığınızda demek?

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) 

Bu Int ler genellikle kendileri Int64 s ile aynı boyuttadır Swift beri, biraz karıştırıcı geçerli: Swift bir NSNumber bir Int64 döküm olacak gibi

let i64: Int64 = 1234567890 
numberFormatter.stringFromNumber(i64) 

görünmüyor. buna numberFormatter oluşturmak için tüm ilgili kodun kapsüller çok hoş, ama bu kod yeniden her zaman geçerli olacaktır:

let n64 = NSNumber(longLong: i64) 

BTW o var trick dikkat:

Sen elle bir NSNumber oluşturarak etrafında çalışabilirsiniz bunu kullan. Alternatif olarak bunu yapabilirsiniz:

let numberFormatter: NSNumberFormatter = { 
    let formattedNumber = NSNumberFormatter() 
    formattedNumber.numberStyle = .DecimalStyle 
    formattedNumber.maximumFractionDigits = 0 
    return formattedNumber 
}() 

bir yapı/sınıfta bir özellik varsa, bu bağlantıyı siz de değişken senin var gibi kullanılması halinde sadece çalışan olmanın yararı olan bir lazy var yapabiliriz ama sadece bir kez.

struct Thing { 
    lazy var numberFormatter: NSNumberFormatter = { 
     println("blah") 
     let formattedNumber = NSNumberFormatter() 
     formattedNumber.numberStyle = .DecimalStyle 
     formattedNumber.maximumFractionDigits = 0 
     return formattedNumber 
    }() 
} 
+1

evet Longlong yöntemi benim için hile yaptı. – Kashif

5
extension Int64 { 
    var formatted:String { 
     let formatter = NSNumberFormatter() 
     formatter.numberStyle = .DecimalStyle 
     formatter.minimumFractionDigits = 0 
     return formatter.stringFromNumber(Int(self)) ?? "" 
    } 
} 

let x:Int64 = 1000000 
x.formatted // "1,000,000"