Swift:差异为String?与?串

Dea*_*ean 19 ios swift

Swift中的as? Stringvs. 之间有区别as String?吗?如果是这样,有什么区别,什么时候应该使用一个与另一个?

Ant*_*nio 35

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

  • variable as? String:variable可以是任何类型,例如数组,整数等.如果是字符串,则转换为字符串,nil否则设置为字符串.

  • variable as String?:variable是a String?,但存储在opaque类型中,例如AnyObject?,或者它是非可选字符串.如果它不同,则会生成运行时异常.

一些例子:

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
Run Code Online (Sandbox Code Playgroud)

所以:

  • as? Type 表示:如果可能,转换为此类型,否则评估为 nil
  • as Type?意思是:强制转换为可选项Type,因为我知道它是可选的Type.据我所知,如果不是这样,就会生成运行时异常

但是,真正的区别在于as?as:前者是一个强制转换的尝试,后者是强制转换,如果不可能则导致运行时错误.

更新201512月14日Swift 1.2以来,as运营商有3种变体:

  • as?nil如果施法失败,则试图施放,评估
  • as!是一个强制转换,如果转换失败导致运行时异常(这是as以前的做法)
  • as现在是一种特殊类型的强制转换,在转换为等效类型时使用,通常是桥接类型,例如Swift StringNSString.


art*_*mal 5

The Swift Programming Language书中,

  1. as是一个类型转换运算符,我们用来向下转换为subclass并且as?用于可选形式,当我们不确定 是否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)")
          }
    }
    
    Run Code Online (Sandbox Code Playgroud)

该示例首先尝试downcast将当前项目作为Movie. 因为item是一个MediaItem实例,它可能是一个Movie; 同样,它也可能是一个Song,甚至只是一个基本的 MediaItem。

  1. String?一个optional value要么包含一个值,要么包含nil来指示该值丢失。

由此,

  1. as? String意味着当你不知道你在贬低什么时,你假设它是 a String,但它可能是 meIntegerFloatorArrayDictionary
  2. as String?意味着它是一个Optional Value,它可能包含一个StringNil值。