Swift:差异为String?与?串

时间:2014-12-19 17:24:39

标签: ios swift

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

4 个答案:

答案 0 :(得分:35)

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

  • variable as? Stringvariable可以是任何类型,例如数组,整数等。如果是字符串,则转换为字符串,否则设置为nil。 / p>

  • variable as String?variableString?,但存储在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

所以:

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

然而,真正的区别在于as?as:前者是强制转换,后者是强制转换,如果不可能则导致运行时错误。

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

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

答案 1 :(得分:4)

来自The Swift Programming Language本书,

  1. as是一个类型强制转换操作符,当我们不确定时,我们将其用于向下转换为subclassas?用于可选表单如果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)")
          }
    }
    
  2. 该示例首先尝试将downcast当前项目设为Movie。由于itemMediaItem个实例,因此它可能是Movie;同样,它也可能是Song,甚至只是一个基础MediaItem。

    1. String? optional value包含值或包含nil,表示该值已丢失。
    2. 从此,

      1. as? String表示当您不知道自己要转发什么内容时,您假设它是String,但可能是Integer或{{1} }}或FloatArray
      2. Dictionary表示它是as String?,可能包含Optional ValueString值。

答案 2 :(得分:0)

是的,有区别。

在第一种情况下,您正在对类型String执行可选的强制转换。如果您尝试投射的对象确实是String,则返回一个值,如果不是,则返回nil。

在第二种情况下,您正在强制转换为String?类型。如果您要投射的值不是字符串,则会使程序崩溃。

答案 3 :(得分:0)

,有差异。

variable as String?向下转换为可选字符串。如果variable不是String?,则会导致运行时异常。

如果您的variable as? String不是nil类型,则variable会返回String,或者将variable返回给字符串。这是条件向下广播,如果您不确定要进行向下投射,则需要使用此广告。