Swift'de, Array [String] dilimleme dönüş türü [String] gibi görünmüyor


87

Bir dizi dizgiyi dilimliyorum ve bunu bir [String]değişkene ayarlıyorum , ancak tür denetleyicisi şikayet ediyor. Olası bir derleyici hatası mı?

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

ekran görüntüsü

Yanıtlar:


169

Aralıklı bir diziye abone olmak bir dizi değil, bir dilim döndürür. Yine de bu dilimden bir dizi oluşturabilirsiniz.

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

3
Belgeli nerede buluyorsunuz Slice? Ayrıca hata mesajı yanlış ve Sliceoyun alanında [String] olarak görünüyor. Böylece iki derleyici hatası ve eksik belgeler var gibi görünüyor.
zaph

1
Abonelik yönteminin tanımını burada görebilirsiniz: developer.apple.com/library/prerelease/ios/documentation/…
Connor

2
Hatanın yanlış olduğunu ve belgelerin biraz çalışabileceğini kabul ediyorum. İki adımda denerseniz: var someTags = tags[1..<3] var someTagsArray: [String] = someTagssize daha fazla yardımcı olurerror: 'Slice<String>' is not convertible to '[String]'
Connor

Benim hatam, Swift iBooks'a baktım. Bence Apple bunları güncel tutmak için kaldırmalı.
zaph

1
Swift 3 ile üçüncü satırda bir hata alıyorum, "Type 'String' protokole 'indekslenebilir' uymuyor".
RenniePet

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

0

Yeni bir dilim dizisi elde etmek için de bunu yapabilirsiniz:

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

Tamam, ama kafa karıştırıcı.
DawnSong

"
İs

0

Diğer bir yolu tek bir yerde değişken bildiriminde birleştirmek olduğunu yapmak let someTags: [String]ve map(_:)bu dönüştürecek ArraySlice<String>için [String]:

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

0

Bir dönüştürmek için başka kolay bir yolu ArraySliceTo Arrayşudur:

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

Mükemmel değil çünkü ona daha sonra bakan başka bir geliştirici (veya kendiniz) amacını anlamayabilir. İyi haber şu ki, bu geliştirici (belki siz) kaldırırsa, + []derhal bir derleyici hatasıyla karşılaşacak ve bu da amacını açıklığa kavuşturacaktır.


0

Dilimi oluşturulduğunda bir Dizi olarak atmanız yeterlidir. Bir ara değişken kullanmak zorunda kalmadan Dizinizi bir dizi olarak tutmak. Bu, Kodlanabilir türleri kullanırken harika çalışıyor.

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.