2016-08-05 15 views
3
var mentions = ["@alex", "@jason", "@jessica", "@john"] 

私は3つの項目に私の配列を制限したいので、私はそれをスプライスしたい:Swiftでアレイスライスを実行するにはどうすればよいですか?

var slice = [String]() 
if mentions.count > 3 { 
    slice = mentions[0...3] //alex, jason, jessica 
} else { 
    slice = mentions 
} 

しかし、私は取得しています:ベース型「[文字列と

あいまいな添字を]」とインデックス型 'レンジ'

アップルスウィフトバージョン2.2(swiftlang-703.0.18.8打ち鳴らす-703.0.31) ターゲット:x86_64版 - アップル、macosx10.9

+1

あなただけの '行うスライス= mentions.prefix(3)' – dan

+0

感謝をさせることができます。しかし、参考のために、0から接頭辞を付けたくなければ、どうすればいいのか教えていただけますか? – TIMEX

答えて

11

mentions[0...3]はではなくArraySlice<String>を返します。したがって、あなたは最初の配列にスライスを変換するためにArray(_:)初期化子を使用することができます。

let first3Elements : [String] // An Array of up to the first 3 elements. 
if mentions.count >= 3 { 
    first3Elements = Array(mentions[0 ..< 3]) 
} else { 
    first3Elements = mentions 
} 

それとも、使用したい場合はArraySlice(彼らは上に「ビュー」を提示して、彼らは、中間計算に便利です元の配列が、長期保存のために設計されていない)、あなたはelseのインデックスの全範囲でmentionsに添字ができます

let slice : ArraySlice<String> // An ArraySlice of up to the first 3 elements 
if mentions.count >= 3 { 
    slice = mentions[0 ..< 3] 
} else { 
    slice = mentions[mentions.indices] // in Swift 4: slice = mentions[...] 
} 

を抜いて最も簡単な解決策はただprefix(_:)メソッドを使用することですが、どのを返します最初のn個の要素、またはnが超えた場合は、アレイ全体のスライスのは、配列はカウント:

let slice = mentions.prefix(3) // ArraySlice of up to the first 3 elements 
+0

あなたが提供した最初の解決策は機能しません。それでも4つの名前すべてを返します。 – TIMEX

+1

@TIMEXこれは、0から3までの4つのアイテムにインデックスを付けているので、元のコードが行っていたことです。最初の3つを必要とする場合は '0 .. <3'の範囲を使用できますもちろんカウントチェックを変更してください)。私はこれを示す答えを更新しました。 – Hamish

関連する問題