Swift에서 Array [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]으로 표시됩니다. 따라서 두 가지 컴파일러 오류와 누락 된 문서가있는 것 같습니다.
zaph

1
여기에서 subscipt 방법의 정의를 볼 수 있습니다. developer.apple.com/library/prerelease/ios/documentation/…
Connor

2
나는 오류가 부정확하고 문서화가 약간의 작업을 사용할 수 있다는 데 동의합니다. 당신은 두 단계를 시도하는 경우 : var someTags = tags[1..<3] var someTagsArray: [String] = someTags그것은 당신에게 더 많은 도움을 제공합니다error: 'Slice<String>' is not convertible to '[String]'
코너

내 잘못은 Swift iBooks를 봤습니다. 나는 애플이 그들을 제거하여 최신 상태로 유지해야한다고 생각한다.
zaph

1
Swift 3을 사용하면 세 번째 줄에 "Type 'String'이 프로토콜 'indexable'을 따르지 않습니다."라는 오류가 표시됩니다.
RenniePet

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

나는 그것이 인쇄 해드립니다 예상 "입니다"
Yitzchak

0

또 다른 방법은 한 장소에서 변수 선언을 결합이라고 할 수 있습니다 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.