2014-09-20 72 views
0

我想爲我的應用程序創建一個自定義的NumberFormatter,以便我有一些其他屬性,例如「lengthSymbol」。 但我想加一個屬性每次這個工程:Swift中的自定義數字格式化程序

let lengthSymbol:String = "ft" 

但實際上我想以後設置的屬性,使我有

let lengthSymbol:String 

而且我想我以後可以做:

init(symbol:String) { 
    lengthSymbol = symbol 
} 

但我得到的,我要實現這個錯誤:

required init(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

這是我的第一個問題:這究竟是什麼?

而且我還必須在「init」函數中執行一些操作 - 出現錯誤「Super.init在返回初始化程序之前未被調用」 現在我該怎麼做?

將是巨大的,如果有人可以幫助我:)

回答

0

添加屬性觀察器功能:

var lengthSymbol: String { 
    didSet { 
     // your initialization stuff here 
    } 
} 

The Swift Programming Language

+0

好的,謝謝我會在稍後閱讀,但是你能告訴我什麼是「super.init」,並且NSCoder是「必需的init」嗎? – borchero 2014-09-20 17:39:20

+0

從您的代碼中刪除init函數,並嘗試我在我的答案中描述的屬性觀察者。如果你的屬性變量只是一個字符串,你不需要重寫init函數。 – zisoft 2014-09-20 18:03:43

2

相應的章節中,你需要的是一個變量,而不是不變。

var lengthSymbol : String? 

它應該是可選的,因爲它最有可能應該工作,無論它是否設置。

+0

好的,謝謝你的工作 - 但如果我想在初始化類時設置變量,我該做些什麼?當我添加「init(symbol:String){...}」時,我總是需要「必需的init」 - 我真的不知道那是什麼..你知道我並不是很熟悉,但還是很快 – borchero 2014-09-20 17:45:40

0

如果格式化程序實例位於Nib文件中,則必須在NSFormatter上實現NSCoding協議。 Archiving guide可以告訴你具體的這個,但長話短說,你只需要實施腳手架方法,並添加一個方法來反序列化lengthSymbol變量並在尾部調用super.init。

init(coder aDecoder: NSCoder) { 
    lengthSymbol = aDecoder.decodeObjectForKey("MyFormatter_LengthKey") 

    return super.init(coder:aDecoder) 
} 

您還必須實施encodeWithCoder,但它非常簡單。

相關問題