尝试理解和欣赏 ArrayLiteralConvertible 的工作原理......
struct Struct<T>: ArrayLiteralConvertible {
init(arrayLiteral elements: T...) {
for element in elements {
print(element)
}
}
}
let str: Struct<Int> = [1,2,3]
Output:
1
2
3
现在我正在尝试做同样的事情,但这次使用我自己的 Array Literal Convertible 版本:
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
编译器不会采用您自己的协议来替代上述任何协议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)