美文网首页swift
《Swift从入门到精通》(十六):类型转换

《Swift从入门到精通》(十六):类型转换

作者: 萧1帅 | 来源:发表于2021-10-15 09:13 被阅读0次

    类型转换(学习笔记)

    环境Xcode 11.0 beta4 swift 5.1

    • 类型转换

      • 类型转换是检查实例类型的一种方法,或者检查来自类层级不同的父类或子类一个实例,用 isas 操作符
    • 为类型转换定义层级结构

      • 示例

        class MediaItem {
            var name: String
            init(name: String) {
                self.name = name
            }
        }
        class Movie: MediaItem {
            var director: String
            init(name: String, director: String) {
                self.director = director
                super.init(name: name)
            }
        }
        // 
        class Song: MediaItem {
            var artist: String
            init(name: String, artist: String) {
                self.artist = artist
                super.init(name: name)
            }
        }
        let library = [
            Movie(name: "Casablanca", director: "Michael Curtiz"),
            Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
            Movie(name: "Citizen Kane", director: "Orson Welles"),
            Song(name: "The One And Only", artist: "Chesney Hawkes"),
            Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
        ]
        // "library" 类型编译器自动推导为: [MediaItem]
        
        
    • 类型检查

      • 示例

        var movieCount = 0
        var songCount = 0
        // 
        for item in library {
            if item is Movie {
                movieCount += 1
            } else if item is Song {
                songCount += 1
            }
        }
        // 
        print("Media library contains \(movieCount) movies and \(songCount) songs")
        // Prints "Media library contains 2 movies and 3 songs"
        
        
    • 类型向下转换

      • 可以用 as?as! 实现类型转换,类型转换有可能失败,as?返回一个可选类型, as!尝试类型转换且强制解包,如果类型转换不不正确,会触发运行时错误

        for item in library {
            if let movie = item as? Movie {
                print("Movie: \(movie.name), dir. \(movie.director)")
            } else if let song = item as? Song {
                print("Song: \(song.name), by \(song.artist)")
            }
        }
        //
        // Movie: Casablanca, dir. Michael Curtiz
        // Song: Blue Suede Shoes, by Elvis Presley
        // Movie: Citizen Kane, dir. Orson Welles
        // Song: The One And Only, by Chesney Hawkes
        // Song: Never Gonna Give You Up, by Rick Astley
        
        
    • Any AnyObject 类型转换

      • Swift 为非指定类型提供了两种特殊类型
        • Any 可以代表实例类型,包括函数

        • AnyObject 可以代表任何类类型的实例

          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:
                  print("zero as an Int")
              case 0 as Double:
                  print("zero as a Double")
              case let someInt as Int:
                  print("an integer value of \(someInt)")
              case let someDouble as Double where someDouble > 0:
                  print("a positive double value of \(someDouble)")
              case is Double:
                  print("some other double value that I don't want to print")
              case let someString as String:
                  print("a string value of \"\(someString)\"")
              case let (x, y) as (Double, Double):
                  print("an (x, y) point at \(x), \(y)")
              case let movie as Movie:
                  print("a movie called \(movie.name), dir. \(movie.director)")
              case let stringConverter as (String) -> String:
                  print(stringConverter("Michael"))
              default:
                  print("something else")
              }
          }
          // 
          // zero as an Int
          // zero as a Double
          // an integer value of 42
          // a positive double value of 3.14159
          // a string value of "hello"
          // an (x, y) point at 3.0, 5.0
          // a movie called Ghostbusters, dir. Ivan Reitman
          // Hello, Michael
          
          
    • 注意

      • 如果你想用可选值作为 Any 值,那么要用 as 操作符显示的将类型转换为 Any

        let optionalNumber: Int? = 3
        things.append(optionalNumber)        // Warning
        things.append(optionalNumber as Any) // No warning
        
        

    相关文章

      网友评论

        本文标题:《Swift从入门到精通》(十六):类型转换

        本文链接:https://www.haomeiwen.com/subject/klopoltx.html