ใน 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] ในสนามเด็กเล่น ดังนั้นจึงดูเหมือนว่ามีข้อผิดพลาดของคอมไพเลอร์สองรายการและเอกสารที่ขาดหายไป
zaph

1
คุณสามารถดูคำจำกัดความของวิธีการย่อยได้ที่นี่: 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]'
Connor

ความผิดของฉันฉันดู Swift iBooks ฉันคิดว่า Apple ควรลบออกเพื่ออัปเดตอยู่เสมอ
zaph

1
ด้วย Swift 3 ฉันได้รับข้อผิดพลาดในบรรทัดที่สาม "ประเภท" สตริง "ไม่เป็นไปตามโปรโตคอล" ที่จัดทำดัชนีได้ ""
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

เพียงแค่โยนชิ้นส่วนเป็นอาร์เรย์เมื่อสร้างขึ้น ทำให้ Array ของคุณเป็นอาร์เรย์โดยไม่ต้องใช้ตัวแปรกลาง ใช้งานได้ดีเมื่อใช้ประเภท Codable

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.