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

2024-02-12

尝试理解和欣赏 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(使用前将#替换为@)

ArrayLiteralConvertible:只是一个普通的协议? 的相关文章

随机推荐