ArrayLiteralConvertible:只是一个普通的协议?

ArrayLiteralConvertible: Just a normal protocol?

试图理解和欣赏 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 有特殊处理?

通常,文字是纯粹的编译时工件。它们可用于生成从该文字初始化的对象,但一旦编译阶段结束,就没有人知道某些东西是文字。

这表明编译器本身需要内置对以下协议的任何支持:

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

编译器不会将您自己的协议替换为上述任何协议。