【问题标题】:Swift typealias without type没有类型的 Swift 类型别名
【发布时间】:2015-07-15 17:43:13
【问题描述】:

没有正确表达式中的类型的 typealias 有什么作用?

在示例中,如果在 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

【问题讨论】:

    标签: swift type-alias


    【解决方案1】:

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

    例如

    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 类型。


    关于默认类型别名,编译

    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)
      }
    }
    

    【讨论】:

    • 谢谢 - 更清楚了。 Baz 类中的 echo 是否应该使用 FooType 而不是 T?
    • @Boon 绝对是的,我的错
    • 协议内声明的 BooleanLiteralType 类型别名是否与协议外声明的类型别名相关?
    • 它将为别名提供默认类型,因此如果协议的实现者本身不提供类型别名,它将默认为Bool
    • @vadian 说协议中定义的 BooleanLiteralType typealias 与外部无关。你说外面那个是默认的。哪个是对的?文档是否指定了这一点?
    【解决方案2】:

    Swift 语言参考中的定义

    协议关联类型声明

    协议使用关键字 typealias 声明关联类型。一个 关联类型为用作 协议的声明。关联类型与类型相似 泛型参数子句中的参数,但它们与 声明它们的协议中的自我。在这种情况下,自我 指符合协议的最终类型。更多 信息和示例,请参阅关联类型。

    【讨论】:

    • 谢谢。看不懂文档。你可以解释吗?协议类型内部的 BooleanLiteralType 是否与外部不同?类型别名在表达式右侧没有任何内容是什么意思?
    • 协议中的 BooleanLiteralType 是符合该协议的类型的占位符。在这种情况下,它必须是 BooleanLiteralType
    • 你是说协议内外的 BooleanLiteralType 不相关?
    • 是的,它们不相关,在协议内部它是一种局部类型变量
    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多