ArrayLiteralConvertible: แค่โปรโตคอลปกติเหรอ?

กำลังพยายามทำความเข้าใจและชื่นชมวิธีการทำงานของ ArrayLiteralConvertible...

struct Struct<T>: ArrayLiteralConvertible {

    init(arrayLiteral elements: T...) {
        for element in elements {
            print(element)
        }
    }
}

let str: Struct<Int> = [1,2,3]

เอาท์พุท:

1
2
3

ตอนนี้ฉันกำลังพยายามทำสิ่งเดียวกัน แต่คราวนี้กับ ArrayLiteralConvertible เวอร์ชันของฉันเอง:

protocol MyALC {
    typealias Element
    init(arrLit elements: Self.Element...)
}

struct NewStruct<T>: MyALC {

    init(arrLit elements: T...) {
        for element in elements {
            print(element)
        }
    }
}

let newStr: NewStruct<Int> = [1,2,3]

อย่างไรก็ตามมันไม่ได้ผล!

error: cannot convert value of type '[Int]' to specified type 'NewStruct'
let newStr: NewStruct = [1,2,3]

ฉันกำลังทำอะไรผิดหรือมีการจัดการพิเศษสำหรับ ArrayLiteralConvertible หรือไม่


person adev    schedule 10.09.2015    source แหล่งที่มา


คำตอบ (1)


โดยทั่วไปแล้ว ตัวอักษรเป็นเพียงส่วนเวลาคอมไพล์เท่านั้น สามารถใช้เพื่อสร้างวัตถุที่เริ่มต้นจากตัวอักษรนั้น แต่เมื่อขั้นตอนการคอมไพล์สิ้นสุดลง ไม่มีใครรู้ว่ามีบางอย่างที่เป็นตัวอักษร

สิ่งนี้ชี้ให้เห็นว่าจำเป็นต้องสร้างการรองรับโปรโตคอลด้านล่างไว้ในคอมไพเลอร์เอง:

  • ArrayLiteralConvertible
  • BooleanLiteralConvertible
  • DictionaryLiteralConvertible
  • ExtendedGraphemeClusterLiteralConvertible
  • FloatLiteralConvertible
  • NilLiteralConvertible
  • IntegerLiteralConvertible
  • StringLiteralConvertible
  • StringInterpolationConvertible
  • UnicodeScalarLiteralConvertible

คอมไพเลอร์จะไม่ใช้โปรโตคอลของคุณเองมาแทนที่โปรโตคอลใดๆ ข้างต้น

person Sergey Kalinichenko    schedule 10.09.2015
comment
ขอบคุณสำหรับคำตอบ dasblinkenlight อย่างไรก็ตาม คำตอบของคุณมีหลายแง่มุม - บางส่วนที่ฉันอยากจะพูดคุย: 1. เข้าใจและเห็นด้วยกับคำพูดของคุณเกี่ยวกับตัวอักษรโดยทั่วไป 2. เข้าใจด้วยว่าเช่นเดียวกับตัวอักษรต้องการการสนับสนุนคอมไพเลอร์ ตัวอักษรโปรโตคอลเหล่านี้ก็ต้องการสิ่งเดียวกันเช่นกัน 3. สิ่งที่เข้าใจได้ยาก (เกี่ยวกับ Swift ไม่ใช่คำตอบของคุณ) ก็คือ Swift จะให้การดูแลเป็นพิเศษกับโปรโตคอลบางอย่าง สิ่งนี้ดูไม่ซื่อสัตย์จากมุมมองของภาษา จะดีกว่ามากหากจำแนกสิ่งเหล่านี้อย่างเปิดเผยด้วยโครงสร้างพิเศษ - person adev; 10.09.2015
comment
@adev วิธีการเมื่อมีการเพิ่มการสนับสนุนคอมไพเลอร์สำหรับคลาสเฉพาะของไลบรารีมาตรฐานเป็นเรื่องปกติในทุกวันนี้ ฉันรู้สถานการณ์ที่สิ่งนี้เกิดขึ้นใน Java, C#, Objective-C และ Swift ยังมีอีกหลายที่ที่ Swift ก็ทำได้เช่นกัน ตัวอย่างเช่น คอมไพเลอร์ได้สนับสนุน Optional<T> ในตัว และสำหรับสิ่งที่คุณสามารถใส่ไว้ในโครงสร้าง if let something = ... {} ได้ด้วย - person Sergey Kalinichenko; 10.09.2015
comment
ขอบคุณ dasblinkenlight ฉันเดาว่าเราต้องรู้สิ่งเหล่านี้เมื่อเกิดขึ้น Esp wrt คลาส ฯลฯ - person adev; 10.09.2015