【问题标题】:How to use Character subscript in Swift 3.1?如何在 Swift 3.1 中使用字符下标?
【发布时间】:2017-07-07 17:49:19
【问题描述】:

我是 Swift 新手。我发现了一些奇怪的下标匹配行为:

struct SubscriptTest {
    subscript(character: Character) -> String {
        return "Character: \(character)"
    }

    subscript(string: String) -> String {
        return "String: \(string)"
    }

    subscript(int: Int) -> String {
        return "Int: \(int)"
    }
}

let test = SubscriptTest()
test["abc"] // String: abc
test[13] // Int: 13
test["????"] // String: ???? (surprisingly)

我认为最后一个测试会匹配我的Character 下标,而不是String 下标。我试图交换下标声明的顺序,认为可能正在使用最后一个匹配的声明。它没有改变任何东西,String 下标仍然用于单个 Character

我知道我可以只使用 String 下标并检查字符数,但我的问题的根源是好奇心。

为什么Character 下标在这里从来不匹配?

【问题讨论】:

    标签: swift swift3 subscript


    【解决方案1】:

    "?" 既可以是 String 文字,也可以是 Character 文字, 并且默认为String(如果两者在上下文中都有效)。与

    test["?" as Character] // Character: ?
    

    let c: Character = "?"
    test[c] // Character: ?
    

    你得到了预期的结果。

    【讨论】:

    • 那么在 Swift 中有没有类似类型优先级的东西?
    • @RoboRobok:文字有一个默认类型。 123 可以是 IntFloatDoubleUInt64 或 ... 。如果无法从上下文中推断出任何其他内容,则将其视为Int
    • 我越来越喜欢 Swift 了 :)
    • 为了好玩(不要在生产代码中这样做),您可以定义 typealias UnicodeScalarType = Character; typealias ExtendedGraphemeClusterType = Character 以将 unicode 标量和字符文字的默认文字类型从 String 更改为 Character : D 然后test["?"] 将调用Character 下标。
    • 上述方法有效,因为当没有其他上下文来推断文字的类型时,编译器会搜索范围内具有给定名称的默认类型。标准库为这些定义了类型,但我们可以覆盖它们。此处列出了每个 ExpressibleBy*Literal 协议的这些默认名称:github.com/apple/swift/blob/master/lib/Sema/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2015-10-03
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多