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
编译器不会将您自己的协议替换为上述任何协议。
试图理解和欣赏 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
编译器不会将您自己的协议替换为上述任何协议。