แปลงชนิดสวิฟท์
แปลงชนิดภาษาสวิฟท์สามารถกำหนดประเภทของอินสแตนซ์ นอกจากนี้ยังสามารถนำมาใช้ในการตรวจสอบว่าเป็นตัวอย่างเช่นประเภทชั้นผู้ปกครองหรือชั้นย่อย
สวิฟท์คือการแปลงชนิดและการใช้งานที่เป็นผู้ประกอบการตระหนักถึงจะใช้ในการตรวจสอบชนิดของค่าที่เป็นสำหรับประเภทการแปลง
แปลงชนิดนอกจากนี้ยังสามารถใช้ในการตรวจสอบว่าชั้นเรียนใช้โปรโตคอล
กำหนดลำดับชั้น
ตัวอย่างของการแปลงชนิดประเภทสำหรับการตรวจสอบไม่ว่าจะเป็นประเภทโดยเฉพาะกรณี
คุณสามารถใช้มันในลำดับชั้นของชั้นเรียนและ subclasses พิมพ์การตรวจสอบกรณีเฉพาะของการเรียนและการแปลงประเภทนี้ในกรณีของลำดับชั้นนี้จะกลายเป็นประเภทอื่น ๆ
ตัวอย่างมีดังนี้
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)")
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
实例物理学是: 固体物理 实例方程式: 赫兹 实例物理学是: 流体动力学 实例公式是: 千兆赫
ตรวจสอบชนิด
การตรวจสอบประเภทคือการใช้คำหลัก
ผู้ประกอบการเพื่อตรวจสอบว่าอินสแตนซ์โดยเฉพาะอย่างยิ่งของชนิดย่อยหากกรณีที่อยู่ในประเภทย่อย, ผู้ประกอบการตรวจสอบชนิดผลตอบแทนจริงมิฉะนั้นก็จะส่งกลับเท็จ
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 个主题
เศร้าใจ
เศร้าใจกับผู้ประกอบการที่มีการแปลง (เป็นหรือไม่หรือเป็น!)
เมื่อคุณไม่แน่ใจเศร้าใจจะประสบความสำเร็จกับสภาพในรูปแบบของการแปลงชนิด (เป็น?) เงื่อนไขในรูปแบบของการแปลงชนิดมักจะส่งกลับค่าตัวเลือก (ค่าตัวเลือก) และถ้าเปิดต่อไปเป็นไปไม่ได้คุ้มค่าทางเลือกที่จะเป็นศูนย์
เพียงคุณเท่านั้นที่สามารถตรวจสอบเศร้าใจจะประสบความสำเร็จเฉพาะเมื่อมีการใช้รูปแบบการศึกษาภาคบังคับ (ตาม!) เมื่อคุณพยายามที่จะเศร้าใจชนิดที่ไม่ถูกต้องในรูปแบบของแปลงชนิดบังคับเรียกข้อผิดพลาด runtime
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
สวิฟท์มีสองประเภทนามแฝงสำหรับชนิดพิเศษของความไม่แน่นอน:
-
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 实例 主题 '固体物理', 兆赫
บังคับรูปแบบของงบเปลี่ยนในกรณีของผู้ประกอบการประเภทการแปลง (ตาม แต่ไม่เป็น?) ในการตรวจสอบและการแปลงไปเป็นประเภทที่เฉพาะเจาะจง