gpt4 book ai didi

swift - 在 Swift 中使用 as 进行类型转换

转载 作者:行者123 更新时间:2023-11-28 15:58:32 26 4
gpt4 key购买 nike

我试图理解 as 类型转换。

阅读 Apple 文档中的类型转换章节,我有两种向下转换的语法(as? 和 as! 运算符),但我没有找到任何关于 as 的信息。所以我认为我永远不应该使用这种运算符,但昨天当我用 do-try-catch 语句输入代码时,我遇到了这个:

catch let error as NSError {
print(error)
}

最初,错误类型符合错误协议(protocol)。现在使用 as NSError 转换,它已成为 NSError 类的实例。

但我的问题是:as operator 是做什么的?这不是一个令人沮丧的肯定..它可以用于“转换”对象吗?

编辑我不认为这是重复的。在我的例子中,错误变量不是一个类,也不是从父类(super class)继承的,所以我没有向上转换。它甚至不是模式匹配。我已经阅读了 Swift 博客页面和 StackOverflow 上的这个主题。

编辑 2来自 Swift 博客

Swift 1.2 separates the notions of guaranteed conversion and forced conversion into two distinct operators. Guaranteed conversion is still performed with the as operator, but forced conversion now uses the as! operator. The ! is meant to indicate that the conversion may fail. This way, you know at a glance which conversions may cause the program to crash.

上面的文字对我不起作用,因为如果我尝试使用 as! 运算符而不是 as,编译器会提示我。

编辑 3即使在 Using Swift with Cocoa and Obj-C文档 他们使用 let-as? 语法来检查和转换为协议(protocol)。那么,为什么在我的情况下,我不能使用它?

最佳答案

首先,正如 dasblinkenlight 评论中所建议的,您的代码片段没有使用 type-casting-operator 。检查 do-statement­ 的语法 你可以找到这些:

catch-clausecatch­ pattern­opt ­where-clause­opt ­code-block­

patternvalue-binding-pattern­

value-binding-patternvar ­patternlet ­pattern­

patterntype-casting-pattern­

type-casting-patternis-pattern­ | as-pattern­

as-patternpattern ­as ­type­

因此,您的EDIT 2 没有任何意义,catch-clause 中没有接受as! 的语法。


但这段代码(使用type-casting-operator)有效,所以我尝试解释如何使用as-casting。

    enum MyError: Error {
case bad
//...
}
let error: Error = MyError.bad
let nsError = error as NSError

如 EI Captain v2.0 评论中的链接文章所示,as-casting 用于保证转换。我收集了一些此类转换的用例。

  • 向上转型

    class Animal {}
    class Dog: Animal {}
    let d = Dog()
    d as Animal // upcast succeeds

    如文章所示,向上转型总是成功的,所以你可以使用as

  • 指定文字类型

    let byte = 123 as UInt8
    let ch = "a" as UnicodeScalar

    在 Swift 中,字面量是无类型的,因此您可以使用 as 来指定字面量的类型

    如果 Swift 可以推断文字的类型,您可以省略 as-casting:

    let byte: UInt8 = 123
    let ch: UnicodeScalar = "a"
  • 消除重载方法的歧义

    class MyClass {
    func aMethod(_ arg: String) {
    print(arg)
    }
    func aMethod(_ arg: Int) {
    print("\"\(arg)\"")
    }
    }
    let obj = MyClass()
    let theFunc = obj.aMethod as (String)->Void
    theFunc("abc") //->abc
  • 始终成功桥接

    let str: String = "a String"
    let nsStr = str as NSString

    let intArr: [Int] = [1,2,3]
    let nsArr = intArr as NSArray

    示例let nsError = error as NSError 包含在该类别中,您需要阅读this article仔细理解为什么这是一个总是成功的桥接


为您的EDIT 3

您可能需要区分这两种语法:

let a: Any = 1

//Using if-let -- Optional binding, `(a as? Int)` is an expression using type-casting-operator which generates an Optional result
if let intA = (a as? Int) {
print("\(intA) is Int")
}

//Using if-case -- pattern matching, `(let intA as Int)` is a pattern using as-pattern
if case (let intA as Int) = a {
print("\(intA) is Int")
}

如前所述,catch 引导一个pattern,您不能在pattern 中使用as?

关于swift - 在 Swift 中使用 as 进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41408299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com