

objective-cで３年ほどプログラムをしていて  
先日からswiftの勉強を始めた者です。

[code]

    // 3つのUILabelを宣言
    var lbLines = [UILabel](count: 3, repeatedValue: UILabel())
    
    for i in 0...2 {
        // 横に並べる様に配置
        lbLines[i].frame = CGRectMake(CGFloat(i * 30),0,30,30)
        lbLines[i].backgroundColor = UIColor.whiteColor()
        self.view.addSubview(lbLines[i])            
    }
    
[/code]

例えばこの様な感じで組んだコードですが  
結果は３つ全て同じ場所（最後にframe内を編集した場所）に配置されてしまいます。

希望の結果を再現するだけであれば方法は色々あるとは思いますが  
この様に配列を使用した方法で表示させるのはswiftでは無理なのでしょうか？


CC BY-SA 3.0
2016-06-13T19:20:47.107
26721
2016-06-13T20:43:34.733
2016-06-13T20:43:34.733
76
16835
question
swift
UILabelを配列で宣言したいのですが、うまく表示されません。


あなたのこの行:

[code]

    var lbLines = [UILabel](count: 3, repeatedValue: UILabel())
    
[/code]

少しわかりにくいのですが、この書き方ですと`UILabel`のインスタンス生成を指示する`UILabel()`の部分は一度しか評価されません。つまり配列の中に入っている3つの参照は全て同じ`UILabel`インスタンスを指しています。Objective-
Cなら、

[code]

    UILabel *label = [[UILabel alloc] init];
    NSArray *lbLines = @[label, label, label];
    
[/code]

なんてやっている感じでしょうか。

`UILabel`を3箇所に表示したいのであれば、インスタンスも3つ作らなければいけません。(これはObjective-CでもSwiftでも同じです。)

最初に示した行を例えばこんな風に変えて試してみてください。

[code]

    var lbLines = [UILabel(), UILabel(), UILabel()]
    
[/code]

* * *

これからSwiftを始められるのであれば、Xcode 8
betaを手に入れて、Swift3を学習した方が良いかも知れません。(現在のSwift2.2とは互換性のない大きな変更がたくさんあります。)


CC BY-SA 3.0
2016-06-13T19:36:43.880
26722
2016-06-13T19:36:43.880
13972
26721
answer