没有类型

时间:2015-07-15 17:43:14

标签: swift type-alias

右表达式没有类型的typealias有什么作用?

在这个例子中,当BooleanLiteralConvertible中的另一个类型已经存在时,在BooleanLiteralConvertible中创建BooleanLiteralType的目的是什么?它们有关系吗?

    /// Conforming types can be initialized with the Boolean literals
    /// `true` and `false`.
    protocol BooleanLiteralConvertible {
        typealias BooleanLiteralType

        /// Create an instance initialized to `value`.
        init(booleanLiteral value: Self.BooleanLiteralType)
    }


    /// The default type for an otherwise-unconstrained Boolean literal.
    typealias BooleanLiteralType = Bool

2 个答案:

答案 0 :(得分:4)

它声明了协议的类型成员,您可以在协议方法定义中引用它。这允许定义通用协议。

例如

protocol Foo {
  typealias FooType

  func echo(x: FooType)
}

class Baz<T: Comparable>: Foo {
  typealias FooType = T

  func echo(x: FooType) {
    println(x)
  }
}

Baz().echo(2) // "2"
Baz().echo("hi") "hi"

函数echo是完全通用的,因为FooType是任何类型。 然后,实现Foo协议的类可以相应地细化和指定FooType

在示例中,我们使用了另一种通用类型(T),因此FooType不会仅仅改为Comparable种类型。

关于默认的typealias,这个编译

protocol Foo {
  typealias FooType

  func echo(x: FooType)
}

typealias FooType = Bool

class Bar: Foo {
  func echo(x: FooType) { // no local definition for `FooType`, default to `Bool`
    println(x)
  }
}

虽然这不是

protocol Foo {
  typealias FooType

  func echo(x: FooType)
}

class Bar: Foo {
  func echo(x: FooType) { // `FooType` can't be resolved as a valid type
    println(x)
  }
}

答案 1 :(得分:1)

Swift语言参考中的定义

  

协议相关类型声明

     

协议使用关键字typealias声明关联类型。一个   关联类型为作为a的一部分使用的类型提供别名   协议的声明。关联类型与类型类似   泛型参数子句中的参数,但它们是相关的   他们被宣布的协议中的自我。在这种背景下,自我   指的是符合协议的最终类型。更多   信息和示例,请参阅关联类型。