2017-01-09 86 views
0

我想要子類UILabel並自動爲其中一個屬性生成一個值,以便我可以初始化某些值,並讓其他值隨機生成。爲類屬性生成值

例如,在這裏我希望能夠創建一個新的MyLabel,爲labelString傳入一個值,併爲labelNumber生成隨機生成的值。

class MyLabel: UILabel { 
    var labelString : String! 
    var labelNumber : Int! 

    init(frame: CGRect, labelString: String) { 
     self.labelString = labelString 
     self.labelNumber = createNumber() 
     super.init(frame: frame) 
    } 

    func createNumber() -> Int { 
     return Int(arc4random()) 
    } 

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

在super.init初始化自我之前,我得到錯誤「方法調用中使用'self'。有沒有辦法解決這個問題,或者是一個更好的模式來使用?

非常感謝您的幫助!

回答

1

在所有內容初始化之前,您無法調用init的實例方法。來處理它的方法之一是讓createNumber被初始化它不需要類static要調用的函數:

class MyLabel: UILabel { 
    var labelString : String! 
    var labelNumber : Int! 

    init(frame: CGRect, labelString: String) { 
     self.labelString = labelString 
     self.labelNumber = MyLabel.createNumber() 
     super.init(frame: frame) 
    } 

    static func createNumber() -> Int { 
     return Int(arc4random()) 
    } 

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

另一種方法來處理它是調用super.init後移動的labelNumber初始化。這是有效的,因爲labelNumber可選,因此最初給出的值爲nil,它滿足在調用超類的init之前初始化子類MyLabel的所有屬性的要求。

class MyLabel: UILabel { 
    var labelString : String! 
    var labelNumber : Int! 

    init(frame: CGRect, labelString: String) { 
     self.labelString = labelString 
     super.init(frame: frame) 
     self.labelNumber = createNumber() 
    } 

    func createNumber() -> Int { 
     return Int(arc4random()) 
    } 

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

順便問一下,有什麼特別的理由讓'labelString'和'labelNumber'成爲* Optional * s?你有什麼理由讓他們'沒有',在這種情況下閱讀他們會因爲你做出來而崩潰*隱式解包可選* s。 – vacawama

+0

使參數選項出來後,另一課(盲目),但在我的情況下,這是沒有必要的。所以第二個解決方案在這裏不起作用,一旦它們不是可選項,但是Static函數是完美的!感謝幫助我解決問題。 – enesefuu

+0

不客氣。您可以通過將其聲明爲'var labelNumber = 0'來使第二個解決方案適用於非可選項 – vacawama