【问题标题】:In Swift, why can I not type-cast to a stored type?在 Swift 中,为什么我不能将类型转换为存储类型?
【发布时间】:2021-02-14 10:34:49
【问题描述】:

我正在尝试在 Swift 中做一些事情,包括运行时检查由于存储为 Any 而被删除的类型(我知道这听起来很难看,但这是一个狭窄的用例,我有很好的理由)。我遇到了一个奇怪的问题,可以用这些例子来总结:

这在 cli/REPL 下有效:

    let pType: Any.Type = Int.self
    if let x = 3 as? pType { print("found an int") }

但这不起作用:

    let pType: Any.Type = Int.self; if let x = 3 as? pType { print("found an int") }

并导致错误:在范围内找不到类型'pType'

当构建为程序时,无论哪种形式,我都会遇到相同的错误。

谁能解释为什么这不起作用?如果有什么办法解决这个问题?如果我所做的完全是错误的,为什么它在 REPL 中有效?

【问题讨论】:

  • "这在 cli/REPL 下工作" 好吧,它不应该。 “如果我所做的完全是错误的,为什么它在 REPL 中起作用?” is 完全是错误的,但我无法解释为什么它在 REPL 中有效。导致这种异常的范围规则有一些非常奇怪的地方。如果您在实际项目中尝试它,您会发现它无法编译,这是正确的。你不能像这样用let 定义一个元类型。这不是 Ruby 或类似的古怪有趣的语言。 :)

标签: swift types casting


【解决方案1】:

我认为您正在寻找的是某种通用的。可能是这样的:

func isThisObject<T>(_ object:Any, ofThisType type: T.Type) -> Bool {
    return object is T
}

例子:

let i : Any = 1
isThisObject(i, ofThisType:Int.self) // true

或者:

let s : Any = "Howdy"
isThisObject(s, ofThisType:Int.self) // false

或者你可以省略Any,没有区别。


或者,如果真的在那儿做演员对你很重要:

func tryToCast<T>(_ object:Any, toThisType type: T.Type) -> T? {
    return object as? T
}

tryToCast(1, toThisType: Int.self) // 1
tryToCast("howdy", toThisType: Int.self) // nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2011-11-20
    相关资源
    最近更新 更多