スイフト型変換
スイフト言語の型変換は、インスタンスのタイプを判定することができます。 インスタンスのインスタンスタイプの親クラスまたはサブクラスかどうかを検出するためにも使用することができます。
スウィフトは、オペレータが実現するように、型変換および使用である変換タイプの場合と同様に、値の型を検出するために使用されます。
型変換は、クラスプロトコルを実装しているかどうか確認するために使用することができます。
クラス階層を定義します。
特定のインスタンスタイプかどうかを検出するための型変換型の例。
あなたはタイプが他のタイプになるようにクラス階層のこのインスタンス内の特定のクラスのインスタンスと、このタイプの変換をチェックし、クラスとサブクラスの階層でそれを使用することができます。
例としては、次のとおりです:
class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } let sa = [ Chemistry(physics: "固体物理", equations: "赫兹"), Maths(physics: "流体动力学", formulae: "千兆赫")] let samplechem = Chemistry(physics: "固体物理", equations: "赫兹") print("实例物理学是: \(samplechem.physics)") print("实例方程式: \(samplechem.equations)") let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫") print("实例物理学是: \(samplemaths.physics)") print("实例公式是: \(samplemaths.formulae)")
上記プログラム実行出力は、次のとおりです。
实例物理学是: 固体物理 实例方程式: 赫兹 实例物理学是: 流体动力学 实例公式是: 千兆赫
タイプをチェック
型チェックは、キーワードを使用することです 。
オペレータは、サブタイプの特定のインスタンスかどうかを確認することです 。 サブタイプに属するインスタンスは、型チェック演算子がtrueを返した場合、それ以外の場合はfalseを返します。
class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } let sa = [ Chemistry(physics: "固体物理", equations: "赫兹"), Maths(physics: "流体动力学", formulae: "千兆赫"), Chemistry(physics: "热物理学", equations: "分贝"), Maths(physics: "天体物理学", formulae: "兆赫"), Maths(physics: "微分方程", formulae: "余弦级数")] let samplechem = Chemistry(physics: "固体物理", equations: "赫兹") print("实例物理学是: \(samplechem.physics)") print("实例方程式: \(samplechem.equations)") let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫") print("实例物理学是: \(samplemaths.physics)") print("实例公式是: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { // 如果是一个 Chemistry 类型的实例,返回 true,相反返回 false。 if item is Chemistry { ++chemCount } else if item is Maths { ++mathsCount } } print("化学科目包含 \(chemCount) 个主题,数学包含 \(mathsCount) 个主题")
上記プログラム実行出力は、次のとおりです。
实例物理学是: 固体物理 实例方程式: 赫兹 实例物理学是: 流体动力学 实例公式是: 千兆赫 化学科目包含 2 个主题,数学包含 3 个主题
ダウンキャスト
意気消沈し、変換演算子を持つ(?それともほど!)
不明な点がある場合にダウンキャストは、型変換の形で条件に、成功することができます(など?)。 型変換の形での条件は、常に任意の値(オプションの値)を返し、次のターンが可能でない場合、代替値はnilになります。
あなただけがダウンキャストが成功するかを決定することができる場合にのみ、強制的な形の使用(など!)。 あなたは間違ったタイプをダウンキャストしようとすると、強制的な型変換の形で実行時エラーがトリガされます。
class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } let sa = [ Chemistry(physics: "固体物理", equations: "赫兹"), Maths(physics: "流体动力学", formulae: "千兆赫"), Chemistry(physics: "热物理学", equations: "分贝"), Maths(physics: "天体物理学", formulae: "兆赫"), Maths(physics: "微分方程", formulae: "余弦级数")] let samplechem = Chemistry(physics: "固体物理", equations: "赫兹") print("实例物理学是: \(samplechem.physics)") print("实例方程式: \(samplechem.equations)") let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫") print("实例物理学是: \(samplemaths.physics)") print("实例公式是: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { // 类型转换的条件形式 if let show = item as? Chemistry { print("化学主题是: '\(show.physics)', \(show.equations)") // 强制形式 } else if let example = item as? Maths { print("数学主题是: '\(example.physics)', \(example.formulae)") } }
上記プログラム実行出力は、次のとおりです。
实例物理学是: 固体物理 实例方程式: 赫兹 实例物理学是: 流体动力学 实例公式是: 千兆赫 化学主题是: '固体物理', 赫兹 数学主题是: '流体动力学', 千兆赫 化学主题是: '热物理学', 分贝 数学主题是: '天体物理学', 兆赫 数学主题是: '微分方程', 余弦级数
任意の型変換とANYOBJECT
スウィフトは、不確実性の特殊なタイプの別名の2種類が用意されています。
-
AnyObject
クラス型のインスタンスを表すことができます。 -
Any
方法の種類(機能タイプ)を含む任意のタイプを表すことができます。
注意:
あなたはそれ明示的な振る舞いと機能必要がある場合にのみ、Any
とAnyObject
。 常に優れているあなたのコードに期待する明示的な型を使用してください。
どれ例
class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } let sa = [ Chemistry(physics: "固体物理", equations: "赫兹"), Maths(physics: "流体动力学", formulae: "千兆赫"), Chemistry(physics: "热物理学", equations: "分贝"), Maths(physics: "天体物理学", formulae: "兆赫"), Maths(physics: "微分方程", formulae: "余弦级数")] let samplechem = Chemistry(physics: "固体物理", equations: "赫兹") print("实例物理学是: \(samplechem.physics)") print("实例方程式: \(samplechem.equations)") let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫") print("实例物理学是: \(samplemaths.physics)") print("实例公式是: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { // 类型转换的条件形式 if let show = item as? Chemistry { print("化学主题是: '\(show.physics)', \(show.equations)") // 强制形式 } else if let example = item as? Maths { print("数学主题是: '\(example.physics)', \(example.formulae)") } } // 可以存储Any类型的数组 exampleany var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Any 实例") exampleany.append(Chemistry(physics: "固体物理", equations: "兆赫")) for item2 in exampleany { switch item2 { case let someInt as Int: print("整型值为 \(someInt)") case let someDouble as Double where someDouble > 0: print("Pi 值为 \(someDouble)") case let someString as String: print("\(someString)") case let phy as Chemistry: print("主题 '\(phy.physics)', \(phy.equations)") default: print("None") } }
上記プログラム実行出力は、次のとおりです。
实例物理学是: 固体物理 实例方程式: 赫兹 实例物理学是: 流体动力学 实例公式是: 千兆赫 化学主题是: '固体物理', 赫兹 数学主题是: '流体动力学', 千兆赫 化学主题是: '热物理学', 分贝 数学主题是: '天体物理学', 兆赫 数学主题是: '微分方程', 余弦级数 整型值为 12 Pi 值为 3.14159 Any 实例 主题 '固体物理', 兆赫
例ANYOBJECT
class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } // [AnyObject] 类型的数组 let saprint: [AnyObject] = [ Chemistry(physics: "固体物理", equations: "赫兹"), Maths(physics: "流体动力学", formulae: "千兆赫"), Chemistry(physics: "热物理学", equations: "分贝"), Maths(physics: "天体物理学", formulae: "兆赫"), Maths(physics: "微分方程", formulae: "余弦级数")] let samplechem = Chemistry(physics: "固体物理", equations: "赫兹") print("实例物理学是: \(samplechem.physics)") print("实例方程式: \(samplechem.equations)") let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫") print("实例物理学是: \(samplemaths.physics)") print("实例公式是: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in saprint { // 类型转换的条件形式 if let show = item as? Chemistry { print("化学主题是: '\(show.physics)', \(show.equations)") // 强制形式 } else if let example = item as? Maths { print("数学主题是: '\(example.physics)', \(example.formulae)") } } var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Any 实例") exampleany.append(Chemistry(physics: "固体物理", equations: "兆赫")) for item2 in exampleany { switch item2 { case let someInt as Int: print("整型值为 \(someInt)") case let someDouble as Double where someDouble > 0: print("Pi 值为 \(someDouble)") case let someString as String: print("\(someString)") case let phy as Chemistry: print("主题 '\(phy.physics)', \(phy.equations)") default: print("None") } }
上記プログラム実行出力は、次のとおりです。
实例物理学是: 固体物理 实例方程式: 赫兹 实例物理学是: 流体动力学 实例公式是: 千兆赫 化学主题是: '固体物理', 赫兹 数学主题是: '流体动力学', 千兆赫 化学主题是: '热物理学', 分贝 数学主题是: '天体物理学', 兆赫 数学主题是: '微分方程', 余弦级数 整型值为 12 Pi 值为 3.14159 Any 实例 主题 '固体物理', 兆赫
特定のタイプにチェックして変換するには(が、ないよう?として)の型変換演算子の場合、switch文の形を余儀なくされました。