Trong Swift, kiểu trả về cắt kiểu Array [String] dường như không phải là [String]


87

Tôi đang cắt một mảng các chuỗi và đặt nó thành một [String]biến, nhưng trình kiểm tra kiểu đang phàn nàn. Nó có thể là một lỗi trình biên dịch?

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

ảnh chụp màn hình

Câu trả lời:


169

Đăng ký một mảng với một phạm vi không trả về một mảng mà là một lát cắt. Tuy nhiên, bạn có thể tạo một mảng từ lát cắt đó.

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

3
Bạn tìm Slicetài liệu ở đâu? Ngoài ra, thông báo lỗi không chính xác và Slicehiển thị dưới dạng [Chuỗi] trong sân chơi. Vì vậy, có vẻ như có hai lỗi trình biên dịch và tài liệu bị thiếu.
zaph

1
Bạn có thể xem định nghĩa của phương thức subcipt tại đây: developer.apple.com/library/prerelease/ios/documentation/…
Connor,

2
Tôi đồng ý rằng lỗi không chính xác và tài liệu có thể sử dụng một số công việc. Nếu bạn thử nó theo hai bước: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsnó mang lại cho bạn những hữu ích hơnerror: 'Slice<String>' is not convertible to '[String]'
Connor

Lỗi của tôi, tôi đã nhìn vào Swift iBooks. Tôi nghĩ rằng Apple nên loại bỏ chúng để giữ cho chúng được cập nhật.
zaph

1
Với Swift 3, tôi gặp lỗi ở dòng thứ ba, "Nhập 'Chuỗi' không phù hợp với giao thức 'có thể lập chỉ mục'".
RenniePet 29/12/16

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

0

Bạn cũng có thể làm điều này để nhận một mảng mới của lát cắt:

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

Nó ổn, nhưng nó khó hiểu.
DawnSong

Tôi dự kiến ​​nó sẽ in "là"
Yitzchak

0

Một cách khác để làm điều đó ở một nơi là kết hợp khai báo biến let someTags: [String]map(_:)điều đó sẽ chuyển ArraySlice<String>thành [String]:

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

0

Một cách thuận tiện khác để chuyển đổi một ArraySlicethành Arraylà:

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

Nó không hoàn hảo vì một nhà phát triển khác (hoặc chính bạn) sau này nhìn vào nó có thể không hiểu mục đích của nó. Tin tốt là nếu nhà phát triển đó (có thể là bạn) loại bỏ + []chúng, họ sẽ ngay lập tức gặp lỗi trình biên dịch, hy vọng sẽ làm rõ mục đích của nó.


0

Chỉ ép lát cắt dưới dạng Mảng khi nó được tạo. Giữ Mảng của bạn dưới dạng một mảng mà không cần phải sử dụng biến trung gian. Điều này hoạt động tốt khi sử dụng các loại Codable.

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.