2017-09-18 3 views
-1

ビューのリストの幅をとり、最大の値を見つけてその値をビューの幅として設定する最も効率的な方法(コードの行の量は最小)は何ですか?この例では、2つのビューに対してif/elseを使用しています(私が達成しようとしていることの説明に役立ちます)が、3つまたは30のビューがあった場合はどうなりますか?あなたがMAX関数を探しているよう複数のビューの最大幅をすべてのビューの幅として設定する最も効率的な方法はありますか?

let label1Width = label1.bounds.width 
let label2Width = label2.bounds.width 

if label1Width > label2Width { 
    label2.frame.size.width = label1Width 
} 

if label2Width > label1Width { 
    label1.frame.size.width = label2Width 
} 
+2

「効率的」と「コードの行の最低額は、」同じことを意味するものではありません。読み取り可能で保守可能なコードを書く。あなたが実際に問題を抱えている場合にのみ効率を心配してください。 – rmaddy

答えて

0

あなた自身。この場合、比較のために.frame.size.widthを使用します。

最大幅を見つけたら、すべてのラベルを繰り返して、各ラベルに最大幅を割り当てることができます。

以下のコードは、プレイグラウンドでテストされており、期待どおりに動作しています。

let labels = [UILabel(),UILabel(),UILabel(),UILabel(),UILabel(),UILabel(),UILabel(),UILabel(),UILabel(),UILabel()] 
labels[3].frame.size.width = 100 
labels[5].frame.size.width = 200 
let maxWidth = labels.max(by: {$0.0.frame.size.width < $0.1.frame.size.width})!.frame.size.width 
labels.forEach{ 
    $0.frame.size.width = maxWidth! 
} 

印刷テスト用幅値:

labels.forEach{ 
    print($0.frame.size.width) //prints 200 for each element of the array 
} 
+1

FYI - あなたのlabels配列は、(構造体ではなくクラスであるため) 'UILabel'の単一インスタンスへの10個の参照を含みます。 'labels.max'を呼び出す前に、すべてのラベルの幅が200になります。この答えは、すべてのラベルに最大幅を見つけて設定する良い方法を示していますが、セットアップコードはコードが実際に正しく動作することを確認しません。 – rmaddy

+0

@rmaddy入力してくれてありがとう、リファレンスタイプの 'Array(repeating:)'の動作については考えていませんでした。私の答えが更新され、テストデータが期待どおりに機能するようになりました。 –

0

は例えば、サウンド:あなたは比較関数を定義し、最大値と配列の要素を見つけるためにmax(by:)を使用することができます

let maxWidth = max(label1.bounds.width, label2.bounds.width)

+0

しかし、質問には、2つではなく30のビューがあるときに何をすべきかを尋ねています。 – rmaddy

+0

'max()'は可変量の引数をとります。 –

関連する問題