はじめに:
この記事の目的は、見やすくするために、自分自身を促す、学習過程を記録することです。練習ツール:遊び場
学習ウェブサイト: swift51
このページにはコンテンツが含まれています。
分析タイプ変換型インスタンスは、親クラスまたはサブクラスのインスタンスの例として見ることができます。
そして型変換演算子として使用することスウィフトに実装されます。これら二つの演算子テックは、値の型をチェックする簡単な方法を提供し、またはそのタイプを変更。
また、タイプがちょうどのように、プロトコルを実装しているかどうかを確認するためにそれを使用することができます一貫性チェックのプロトコルと同じ部分についてです。
クラス階層の例を定義します
あなたは、特定のクラスの型チェックと、この階層の他のタイプのクラスインスタンスのこのタイプの変換の変換クラスとサブクラスの階層、インスタンスを入力することができます。次の3つのコードセグメントは、変換のタイプの例として、クラス階層及びこれらのクラスのインスタンスを含む配列を定義します。
第1のコードセグメントは、新しい基底クラスMediaItemを定義します。このクラスは、基本的な機能を提供するメディアアイテムのあらゆるデジタルメディアライブラリに表示されます。特に、それは、String型の名前のプロパティを宣言し、初期化(名前:)初期化子。(メディア項目のすべてが名前を持っていると仮定。)
class MediaItem { var name: String init(name: String) { self.name = name } }
次のコードセグメントはMediaItemの2つのサブクラスを定義します。最初のサブクラスの映画は、映画に関連する追加情報、取締役(取締役)の追加プロパティをカプセル化し、対応する親クラスに基づいて初期化(または基本クラス)にされます。親クラスに基づいて、第2のサブクラスの歌は、アーティスト(芸術家)の特性、および対応する初期化子を追加します。
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) } }
最後のコードスニペットは、2つおよび3つのインスタンス映画ソングインスタンスを含む、一定の配列ライブラリーを作成します。それは推論のその配列に含まれるコンテンツに基づいている場合、ライブラリタイプが初期化されます。スウィフトのタイプの検出器ムービーソングを推測すると、共通の親クラスMediaItemを持つことができ、それは、ライブラリのクラスタイプとして[MediaItem]推論しました:
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]
ライブラリ内の舞台裏で、まだメディア・アイテムの映画や歌の種類を格納しています。しかし、あなたはそれを繰り返す場合は、判明例はMediaItemタイプではなく、作品と歌のタイプになります。作品の元の型としてそれらを作成するには、同じ以下に説明するように、自分のタイプをチェックしたり、ダウンし、他のタイプに変換する必要があります。
タイプをチェック
型チェックオペレータによるサブタイプの特定のインスタンスかどうかをチェックする(IS)。サブタイプに属しているインスタンスは、型チェック演算子がtrueを返した場合、それ以外の場合はfalseを返します。
次の例では、アレイとソングムービータイプライブラリのインスタンスの数を計算するために使用される2つの変数movieCountとsongCountを定義します:
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") // 打印 “Media library contains 2 movies and 3 songs”
配列のライブラリ内のすべての項目の例を反復。各回、-のための次のセットアイテムMediaItemアレイへループ。
現在MediaItemムービー型のインスタンスである場合、アイテムは、映画がtrueを返し、それ以外の場合はfalseです。同様に、アイテムは曲の歌は、アイテム型のインスタンスであるかどうかをチェックします。サイクルの終わりに、及びsongCount movieCount値は、それぞれのタイプのインスタンスの数が発見されたです。
愁い
タイプの定数または変数は、実際に舞台裏でサブクラスに属していてもよいです。これが事実であると判断された場合、あなたは変換演算子で、そのサブタイプに下るしようとすることができます(など?それともとして!)。
下方遷移は、2つの異なる形式で変換演算子のタイプと、失敗する可能性があるからです。条件は、?あなたがタイプに断るしようとしているオプションの戻り値を形成します。意気消沈!ASフォームを強制し、結合操作に開梱変換結果を試みることを余儀なくされました。
あなたがわからない場合はダウンキャストは、(など?)キャストの形で条件で、成功することができます。キャストの形での条件は、常に任意の値を返し、転送が不可能な場合は、オプションの値がゼロになります。これは下向きの移行が成功した確認することができます。
あなただけが下向きの遷移が強制の成功のみの使用形態になるかを決定することができます(のように!)。あなたは間違ったタイプをダウンキャストしようとすると、必須型変換の形で実行時エラーをトリガします。
ライブラリMediaItemの各反復で、以下の実施例、および適切な説明をプリントアウト。これを行うには、項目だけではなくMediaItemとして、実際に映画や歌の型として使用する必要があります。必要な説明、中の映画の歌やアーティストやディレクターの属性を使用するためには。
この例では、アレイは、各項目またはムービーソングであってもよいです。(?のように)あなたは、各サイクルで次のターンを確認するにはキャストの形態での使用の条件ので、ここでは、事前に本当の各項目の種類を知りません。
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
映画化項目の例の最初の試み。アイテムタイプMediaItemのインスタンスであるため、それは映画であってもよく、同様に、それはまた、歌、または単に基本クラスMediaItemであってもよいです。不確実性の、などから?返されるオプションの値で回転しようとしたときに形成されます。項目として?作品の戻り値は、作品?または「オプションの作品」です。
ときに、2つの歌のインスタンス意気消沈作品のアプリケーションは失敗しますとき。この状況に対処するために、上記の例では、必要に応じてムービーを検証オプション結合(バインディングオプション)を使用すると、実際の値が含まれている(この場合、転送が成功したかどうかを決定することである。)任意の結合があれば、「書かれています映画=項目が「ムービーとして、あなたがこれを解釈することができましょう?:
“尝试将 item 转为 Movie 类型。若成功,设置一个新的临时常量 movie 来存储返回的可选 Movie 中的值”
下方への移行が成功した場合、ムービーのプロパティは、その監督名監督を含め、映画インスタンスの説明を印刷するために使用されます。それはソングプリント(アーティストの名前を含む)に記載され発見された場合にも同様の原理は、ソングのインスタンスを検出するために使用されます。
なお、
変換が本当にインスタンスまたはその値を変更しません。基本の例としては、一定のままである;それは型に変換されるように、単にそれを使用します。
任意の型変換とANYOBJECT
スウィフトは、不確実性の特殊なタイプの別名の2種類が用意されています。
- Any 可以表示任何类型,包括函数类型。 - AnyObject 可以表示任何类类型的实例。
どれと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)" })
int型のものの配列は、2つの値、二つの値ダブル、文字列値、タプル(ダブル、ダブル)、映画インスタンス「ゴーストバスターズ」が含まれており、文字列を受け入れ、別の式の文字列値クロージャを返します。
あなたは、ISを使用して式の場合スイッチ内の事業者が発見するようにのみ、一定または可変のいずれのタイプやANYOBJECTの特定のタイプを知ることができます。次の例では、物事の配列内の各アイテムを反復処理し、switch文を持つすべてのタイプを見つけます。これらの値は印刷することができるように、一定の指定された型の値にバインドするためにマッチしたいくつかのswitchステートメントの場合:
各配列内のアイテム、およびswitch文を持つすべてのタイプを見つけます。これらの値は印刷することができるように、一定の指定された型の値にバインドするためにマッチしたいくつかのswitchステートメントの場合:
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
注
任意のタイプの任意のタイプを含むすべてのタイプの値を表すことができます。スウィフトは、あなたはあなたに警告を与える、任意の値を表すために、任意の型を使用します。あなたが任意の値を運ぶために、任意の型を使用したい場合は、次のように明示的に、どれを変換演算子として使用することができます。let optionalNumber: Int? = 3 things.append(optionalNumber) // 警告 things.append(optionalNumber as Any) // 没有警告
ます。https://www.jianshu.com/p/2cd01c62bd9bで再現