2017-01-09 7 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からインスタンスメソッドを呼び出すことはできません。それを処理するための

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の初期化を移動することです。それを処理する1つの方法は、createNumberと呼ばれるように初期化するクラスを必要としないstatic機能を作ることです。これは、labelNumberのオプションであるため、最初にサブクラスMyLabelのすべてのプロパティがスーパークラスのinitを呼び出す前に初期化されるという要件を満たすnilという値が与えられているためです。

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 *にしたいと思う特別な理由はありますか?あなたがそれらを "無条件"にする理由は何でしょうか?その場合、それらを読むことは、* Implicitly Unwrapped Optional *を行ったのでクラッシュします。 – vacawama

+0

パラメータオプションを別のレッスン(盲目的)の後に出てきましたが、私の場合は必要ありません。したがって、2番目の解決策はオプションではなく、ここでは機能しませんが、静的関数は完璧です!助けてくれてありがとうございました。 – enesefuu

+0

よろしくお願いいたします。 2番目のソリューションを 'var labelNumber = 0'と宣言することで、非標準的なオプションで動作させることができます – vacawama

関連する問題