需要澄清Swift中的Type Casting操作符

时间:2015-08-01 08:14:40

标签: swift casting typecasting-operator

为什么在此switch语句中使用类型转换操作符(as)而不是其条件形式(as?)?

我认为类型操作符只能是(as?)或(as!)...? Apple Swift文档没有提供足够的解释。

以下是Swift文档中的示例:

var things = [Any]()

things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
things.append({ (name: String) -> String in "Hello, \(name)" }) 

for thing in things {
        switch thing {
        case 0 as Int:
            println("zero as an Int")
        case 0 as Double:
            println("zero as a Double")
        case let someInt as Int:
            println("an integer value of \(someInt)")
        case let someDouble as Double where someDouble > 0:
            println("a positive double value of \(someDouble)")
        case is Double:
            println("some other double value that I don't want to print")
        case let someString as String:
            println("a string value of \"\(someString)\"")
        case let (x, y) as (Double, Double):
            println("an (x, y) point at \(x), \(y)")
        case let movie as Movie:
            println("a movie called '\(movie.name)', dir. \(movie.director)")
        case let stringConverter as String -> String:
            println(stringConverter("Michael"))
        default:
            println("something else")
        }
    }

以下是Apple Swift documentation on Type Casting

的链接

3 个答案:

答案 0 :(得分:4)

如果你阅读了底部的note,你本可以找到答案:

  

switch语句的情况使用类型转换运算符的强制版本(作为,而不是作为?)来检查并转换为特定类型。在switch case语句的上下文中,此检查始终是安全的。

(强调我的)

Here是一篇Apple博客文章,详细阐述了as?asas!之间的区别。

答案 1 :(得分:1)

ascase 0 as Int:中的case let someInt as Int: 是其一部分 类型的投射模式。在switch语句的Swift Language Reference case标签中 定义为

  

案例标签案例案例项目列表:
  案例项目列表→   pattern guard-clause opt | pattern guard-clause opt ,case-item-list

其中模式可以(在其他情况下)

  

模式→值绑定模式
   pattern →type-casting-pattern
  模式→表达模式

和类型转换模式是

  

type-casting-pattern →is-pattern |作为图案
   is-pattern 类型
   as-pattern →模式类型

所以你有例如

case let someInt as Int:
╰──────────────────────╯ case-label
     ╰────────────────╯  case-item-list -> type-casting pattern
                    ╰─╯  type
                 ╰╯      `as` keyword
     ╰─────────╯         value-binding pattern

答案 2 :(得分:0)

夫特-博客:

  

在Swift中记住这些运算符的模式可能最容易:暗示“这可能陷阱”,而?表示“这可能是零。”

当完成向上转换时,有第三种保证转换的可能性。例如,2 as Anyas!as?

一起使用时会收到警告

如果是switch结构,case let value as Type:永远不会失败,也不存在可能性,与表达式value as? Type

相比,该值将是一个可选类型