Swift:区别为String? 作为? string

as? String有区别as? String as? Stringas String? 在Swift中? 如果是这样,有什么区别,我应该什么时候使用一个与另一个?

有一个微妙但重要的区别:

  • variable as? String variable as? Stringvariable可以是任何types,例如数组,整数等。如果string是string,则转换为string,否则设置nil

  • variable as String?variable是一个String? ,但存储在一个不透明的types,如AnyObject? ,或者它是一个非可选的string。 如果不同,则会生成运行时exception。

一些例子:

 var x: AnyObject? = "Test" x as String? // OK, the result is an optional string x as? String // OK, evaluates to an optional string "string" as String? // OK, evaluates to optional string x as? Int // OK, evaluates to nil, it's not an Int x as Int? // Runtime exception, it's not castable to optional Int 

所以:

  • as? Type as? Type意思是:如果可能的话转换为这种types,否则评估nil
  • as Type? 意思是:转换为一个可选的Type ,因为我知道这是一个可选的Type 。 我明白,如果不是这样,就会产生运行时exception

但真正的区别在于as? as :前者是试图施放,后者是强制施放,如果不可能造成运行时错误。

更新201512月14日Swift 1.2以来,有3个变种的运算符:

  • as? 是一个试图施放,如果施法失败,评估nil
  • as! 是一个强制转换,导致运行exception,如果转换失败(这是以前所做的)
  • 现在是一种特殊types的types转换,通常是桥接types,比如Swift的StringNSString

The Swift Programming Language书中,

  1. as一个types转换运算符 ,我们用它来贬低到subclassas? 被用于一个可选的forms,当我们不确定是否downcast会成功。 考虑下面的例子
     for item in library { if let movie = item as? Movie { println("Movie: '(movie.name)', dir. (movie.director)") } else if let song = item as? Song { println("Song: '(song.name)', by (song.artist)") } } 

该示例首先尝试将当前项目下载为Movie 。 因为item是一个MediaItem实例,所以它可能是一个Movie ; 同样,它也有可能是一首Song ,甚至只是一个基本的媒体项目。

  1. String? 一个optional value包含一个值或者包含nil来表示缺失值。

由此,

  1. as? String as? String意思是当你不知道你是什么意思,你假设为一个String ,但它可能是我的IntegerFloatDictionary
  2. as String? 意味着它是一个Optional Value ,它可能包含一个StringNil值。

是,有一点不同。

在第一种情况下,您正在对Stringtypes进行可选转换。 这将返回一个值,如果你试图施放的对象确实是一个String否则为零。

在第二种情况下,您正在强制转换为String?typesString? 。 如果您正在转换的值不是string,则会导致程序崩溃。

是的 ,有差别。

variable as String? downcast为可选的String.If variable不是String? 它会导致运行时exception。

variable as? String 如果你的variable不是Stringtypes或者将downcast variable返回给String,那么variable as? String将返回nil 。 这是有条件的向下转换 ,如果你不确定下来你需要使用这个。