右表达式没有类型的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
答案 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的一部分使用的类型提供别名 协议的声明。关联类型与类型类似 泛型参数子句中的参数,但它们是相关的 他们被宣布的协议中的自我。在这种背景下,自我 指的是符合协议的最终类型。更多 信息和示例,请参阅关联类型。