ArrayLiteralConvertible

ArrayLiteralConvertible

试图理解和欣赏 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/

    10-13 04:21