试图理解和欣赏 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
Now I am trying to do the same thing but this time with my own version of 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]
然而它不起作用!
错误:无法将“[Int]”类型的值转换为指定类型“NewStruct”
让 newStr: NewStruct = [1,2,3]
我做错了什么还是对 ArrayLiteralConvertible 有特殊处理?
最佳答案
通常,文字是纯粹的编译时工件。它们可用于生成从该文字初始化的对象,但是一旦编译阶段结束,没有人知道某些东西是文字。
这表明对以下协议(protocol)的任何支持都需要内置到编译器本身中:
ArrayLiteralConvertible
BooleanLiteralConvertible
DictionaryLiteralConvertible
ExtendedGraphemeClusterLiteralConvertible
FloatLiteralConvertible
NilLiteralConvertible
IntegerLiteralConvertible
StringLiteralConvertible
StringInterpolationConvertible
UnicodeScalarLiteralConvertible
编译器不会将您自己的协议(protocol)作为上述任何协议(protocol)的替代品。
关于swift - ArrayLiteralConvertible : Just a normal protocol?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32502727/