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

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

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

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

Xcode

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

Swift

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

Q&A

解決済

3回答

849閲覧

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

soujomitsuura

総合スコア24

iOS

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

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/01/17 10:36

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

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

よろしくお願いします。

swift

1 let sakebiArray = [ 2 "Najakorya", 3 "Nandaikorya", 4 "Fuusenjai", 5 "Nandatte", 6 "AIIIIIII", 7 "BAAAAAAA" 8 ] as [Any] 9 10 for (index, title) in sakebiArray.enumerated() { 11 let label = UILabel() 12 label.text = "(title)" 13 label.font = UIFont.systemFont(ofSize: 15) 14 label.textColor = UIColor.white 15 label.textAlignment = .center 16 label.sizeToFit() 17 let number:CGFloat = CGFloat(index) 18 label.frame.origin = CGPoint(x: /*ここで(index - 1)の(label.frame.size.width)が欲しい*/, y: 40) 19 print(index) 20 print(label.frame.size.width) 21 print(label.frame.size.width * number) 22 self.view.addSubview(label) 23 }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

swift

1... 2var horizontalPosition: CGFloat = 0 3for (index, title) in sakebiArray.enumerated() { 4 ... 5 label.frame.origin = CGPoint(x: horizontalPosition, y: 40) 6 horizontalPosition += label.frame.size.width 7 self.view.addSubview(label) 8}

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

投稿2018/01/17 11:24

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakasho_dev

2018/01/17 11:26

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

2018/01/17 11:35

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

2018/01/17 14:14

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

0

ベストアンサー

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

Swift

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

投稿2018/01/17 11:25

nakasho_dev

総合スコア2655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soujomitsuura

2018/01/17 14:14

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

0

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

swift

1[ 2 "Najakorya", 3 "Nandaikorya", 4 "Fuusenjai", 5 "Nandatte", 6 "AIIIIIII", 7 "BAAAAAAA" 8 ] 9 .map { title -> UILabel in 10 let label = UILabel() 11 label.text = "(title)" 12 label.font = UIFont.systemFont(ofSize: 15) 13 label.textColor = UIColor.white 14 label.textAlignment = .center 15 label.sizeToFit() 16 17 return label 18 } 19 .reduce(CGFloat(0.0)) { left, label in 20 21 print(left) 22 23 label.frame.origin = CGPoint(x: left, y: 40) 24 view.addSubview(label) 25 26 return left + label.frame.size.width 27}

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

投稿2018/01/17 16:29

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問