質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.03%

  • Swift

    6067questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3494questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3451questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift Arrayを用いたfor文で一つ前の値を取得したい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 134

soujomitsuura

score 16

こんにちは
下記のようなfor文をarrayを用いて記載してみました。

下記コード内にコメントアウトして記載してありますが、array配列の常に一つ前の要素のwidthを取得したいのですが、どのようにすれば取得できるでしょうか?

よろしくお願いします。

        let sakebiArray      = [
            "Najakorya",
            "Nandaikorya",
            "Fuusenjai",
            "Nandatte",
            "AIIIIIII",
            "BAAAAAAA"
            ] as [Any]

        for (index, title) in sakebiArray.enumerated() {
            let label           = UILabel()
            label.text          = "\(title)"
            label.font          = UIFont.systemFont(ofSize: 15)
            label.textColor     = UIColor.white
            label.textAlignment = .center
            label.sizeToFit()
            let number:CGFloat  = CGFloat(index)
            label.frame.origin  = CGPoint(x: /*ここで(index - 1)の(label.frame.size.width)が欲しい*/, y: 40)
            print(index)
            print(label.frame.size.width)
            print(label.frame.size.width * number)
            self.view.addSubview(label)
        }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

前に戻って取得したいという発想を逆にして「後で参照するために覚えておく」とするのもアリと思います。

...
var horizontalPosition: CGFloat = 0
for (index, title) in sakebiArray.enumerated() {
  ...
  label.frame.origin  = CGPoint(x: horizontalPosition, y: 40)
  horizontalPosition += label.frame.size.width
  self.view.addSubview(label)
}

のような雰囲気で。(ちなみに自分はAppleのOS環境がないのでhorizontalPositionの型としてCGFloatが適切かどうか知らずに書いています。また質問者さんが実際にUILabelをどのようにレイアウトしようとしているかも適当に想定しています。そのあたりは適宜読み替えてください)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/17 20:26

    重なりました。すいません。

    キャンセル

  • 2018/01/17 20:35

    いえ自分もよくやりますorz

    キャンセル

  • 2018/01/17 23:14

    回答ありがとうございます。

    キャンセル

checkベストアンサー

+1

ループの手前で以下のような変数を宣言して使い終わったら、現在のラベルの幅を入れるのはいかがでしょう。

var previousWidth:CGFloat = 0.0
for (index, title) in sakebiArray.enumerated() {
省略
label.frame.origin  = CGPoint(x: previousWidth, y:40)
previousWidth = label.frame.size.width
省略

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/17 23:14

    回答ありがとうございます。

    キャンセル

0

すでにベストアンサーが出てますが、発想を変えた別解を。

[
    "Najakorya",
    "Nandaikorya",
    "Fuusenjai",
    "Nandatte",
    "AIIIIIII",
    "BAAAAAAA"
    ]
    .map { title -> UILabel in
        let label           = UILabel()
        label.text          = "\(title)"
        label.font          = UIFont.systemFont(ofSize: 15)
        label.textColor     = UIColor.white
        label.textAlignment = .center
        label.sizeToFit()

        return label
    }
    .reduce(CGFloat(0.0)) { left, label in

        print(left)

        label.frame.origin = CGPoint(x: left, y: 40)
        view.addSubview(label)

        return left + label.frame.size.width
}

無駄な変数やenumerated()が排除できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    6067questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3494questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3451questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。