Swift4.2语言规范(二十) 类型转换
类型转换是一种检查实例类型的方法,或者将该实例视为与其自己的类层次结构中的其他位置不同的超类或子类。 Swift中的类型转换是使用 您还可以使用类型转换来检查类型是否符合协议,如检查协议一致性中所述。 为类型转换定义类层次结构您可以使用类型转换和类和子类的层次结构来检查特定类实例的类型,并将该实例强制转换为同一层次结构中的另一个类。下面的三个代码片段定义了类的层次结构和包含这些类的实例的数组,用于类型转换的示例。 第一个片段定义了一个名为的新基类 1 class MediaItem { 2 var name: String 3 init(name: String) { 4 self.name = name 5 } 6 } 下一个片段定义了两个子类 1 class Movie: MediaItem { 2 var director: String 3 init(name: String,director: String) { 4 self.director = director 5 super.init(name: name) 6 } 7 } 8 9 class Song: MediaItem { 10 var artist: String 11 init(name: String,artist: String) { 12 self.artist = artist 13 super.init(name: name) 14 } 15 } 最后一个片段创建一个名为的常量数组 1 let library = [ 2 Movie(name: "Casablanca",director: "Michael Curtiz"),3 Song(name: "Blue Suede Shoes",artist: "Elvis Presley"),4 Movie(name: "Citizen Kane",director: "Orson Welles"),5 Song(name: "The One And Only",artist: "Chesney Hawkes"),6 Song(name: "Never Gonna Give You Up",artist: "Rick Astley") 7 ] 8 // the type of "library" is inferred to be [MediaItem] 存储在项目 类型检查使用类型检查运算符( 下面的例子定义两个变量, 1 var movieCount = 0 2 var songCount = 0 3 4 for item in library { 5 if item is Movie { 6 movieCount += 1 7 } else if item is Song { 8 songCount += 1 9 } 10 } 11 12 print("Media library contains (movieCount) movies and (songCount) songs") 13 // Prints "Media library contains 2 movies and 3 songs" 此示例遍历
向下转型某个类类型的常量或变量实际上可能是指幕后子类的实例。在您认为是这种情况的情况下,您可以尝试使用类型转换运算符( 由于向下转换可能会失败,因此类型转换运算符有两种不同的形式。条件形式,
下面在每个迭代的例子 在此示例中,数组中的每个项可能是a? ? 该示例首先尝试将当前向下转换 1 for item in library { 2 if let movie = item as? Movie { 3 print("Movie: (movie.name),dir. (movie.director)") 4 } else if let song = item as? Song { 5 print("Song: (song.name),by (song.artist)") 6 } 7 } 8 9 // Movie: Casablanca,dir. Michael Curtiz 10 // Song: Blue Suede Shoes,by Elvis Presley 11 // Movie: Citizen Kane,dir. Orson Welles 12 // Song: The One And Only,by Chesney Hawkes 13 // Song: Never Gonna Give You Up,by Rick Astley 个基础
“尝试访问 如果向下转换成功, 注意 转换实际上不会修改实例或更改其值。基础实例保持不变;?它被简单地处理和访问,作为它的类型的实例。 非特定类型Swift提供了两种特殊类型来处理非特定类型:
使用 以下是使用 1 var things = [Any]() 2 3 things.append(0) 4 things.append(0.0) 5 things.append(42) 6 things.append(3.14159) 7 things.append("hello") 8 things.append((3.0,5.0)) 9 things.append(Movie(name: "Ghostbusters",director: "Ivan Reitman")) 10 things.append({ (name: String) -> String in "Hello,(name)" }) 该 要发现特定类型的只是已知类型的固定或可变的 1 for thing in things { 2 switch thing { 3 case 0 as Int: 4 print("zero as an Int") 5 case 0 as Double: 6 print("zero as a Double") 7 case let someInt as Int: 8 print("an integer value of (someInt)") 9 case let someDouble as Double where someDouble > 0: 10 print("a positive double value of (someDouble)") 11 case is Double: 12 print("some other double value that I don‘t want to print") 13 case let someString as String: 14 print("a string value of "(someString)"") 15 case let (x,y) as (Double,Double): 16 print("an (x,y) point at (x),(y)") 17 case let movie as Movie: 18 print("a movie called (movie.name),dir. (movie.director)") 19 case let stringConverter as (String) -> String: 20 print(stringConverter("Michael")) 21 default: 22 print("something else") 23 } 24 } 25 26 // zero as an Int 27 // zero as a Double 28 // an integer value of 42 29 // a positive double value of 3.14159 30 // a string value of "hello" 31 // an (x,y) point at 3.0,5.0 32 // a movie called Ghostbusters,dir. Ivan Reitman 33 // Hello,Michael 注意 该 1 let optionalNumber: Int? = 3 2 things.append(optionalNumber) // Warning 3 things.append(optionalNumber as Any) // No warning (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |