Swiftでは、配列[String]のスライスの戻り値の型が[String]ではないようです。


87

文字列の配列をスライスして[String]変数に設定していますが、型チェッカーが文句を言っています。コンパイラのバグの可能性はありますか?

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]

スクリーンショット

回答:


169

配列に範囲の添え字を付けると、配列は返されませんが、スライスが返されます。ただし、そのスライスから配列を作成することはできます。

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)

3
どこにSlice文書化されていますか?また、エラーメッセージが正しくなくSlice、遊び場に[String]として表示されます。したがって、2つのコンパイラエラーとドキュメントの欠落があるようです。
zaph 2014

1
subsciptメソッドの定義は次の場所で確認できます:developer.apple.com/library/prerelease/ios/documentation/…–
Connor

2
エラーが正しくなく、ドキュメントに何らかの作業が必要になる可能性があることに同意します。2つのステップで試してみるとvar someTags = tags[1..<3] var someTagsArray: [String] = someTags、より便利になりますerror: 'Slice<String>' is not convertible to '[String]'
Connor

私のせいで、SwiftiBooksを見ました。Appleはそれらを削除して、最新の状態に保つべきだと思います。
zaph 2014

1
Swift 3では、3行目に「タイプ '文字列'がプロトコル 'インデックス可能'に準拠していません」というエラーが表示されます。
RenniePet 2016

14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"

0

これを実行して、スライスの新しい配列を取得することもできます。

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]

大丈夫ですが、紛らわしいです。
DawnSong 2017年

「is」と表示されると思っていました
Yitzchak 2017

0

これを1か所で行う別の方法は、変数宣言let someTags: [String]とを組み合わせることですmap(_:)。これは次のように変換さArraySlice<String>[String]ます。

let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]

0

変換するもう一つの便利な方法ArraySliceにはArray、この次のとおりです。

var tags = ["this", "is", "cool"] var someTags: [String] = tags[1..<3] + []

後でそれを見る別の開発者(またはあなた自身)がその目的を理解しないかもしれないので、それは完璧ではありません。幸いなことに、その開発者(おそらくあなた)が削除する+ []と、すぐにコンパイラエラーが発生し、その目的が明確になることを願っています。


0

作成時にスライスを配列としてキャストするだけです。中間変数を使用せずに配列を配列として保持します。これは、Codableタイプを使用する場合に最適です。

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.