- Swift - Access Control
- Swift - Generics
- Swift - Protocols
- Swift - Extensions
- Swift - Type Casting
- Swift - Optional Chaining
- Swift - ARC Overview
- Swift - Deinitialization
- Swift - Initialization
- Swift - Inheritance
- Swift - Subscripts
- Swift - Methods
- Swift - Properties
- Swift - Classes
- Swift - Structures
- Swift - Enumerations
- Swift - Closures
- Swift - Functions
- Swift - Dictionaries
- Swift - Sets
- Swift - Arrays
- Swift - Characters
- Swift - Strings
- Swift - Loops
- Swift - Decision Making
- Swift - Operators
- Swift - Literals
- Swift - Constants
- Swift - Tuples
- Swift - Optionals
- Swift - Variables
- Swift - Data Types
- Swift - Basic Syntax
- Swift - Environment
- Swift - Overview
- Swift - Home
Swift Useful Resources
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
Swift - Type Casting
To vapdate the type of an instance Type Casting comes into play in Swift 4 language. It is used to check whether the instance type belongs to a particular super class or subclass or it is defined in its own hierarchy.
Swift 4 type casting provides two operators is to check the type of a value and as and to cast the type value to a different type. Type casting also checks whether the instance type follows particular protocol conformance standard.
Defining a Class Hierarchy
Type casting is used to check the type of instances to find out whether it belongs to particular class type. Also, it checks hierarchy of classes and its subclasses to check and cast those instances to make it as a same hierarchy.
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: "sopd physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")] let samplechem = Chemistry(physics: "sopd physics", equations: "Hertz") print("Instance physics is: (samplechem.physics)") print("Instance equation is: (samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") print("Instance physics is: (samplemaths.physics)") print("Instance formulae is: (samplemaths.formulae)")
When we run the above program using playground, we get the following result −
Instance physics is: sopd physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz
Type Checking
Type checking is done with the is operator. The is type check operator checks whether the instance belongs to particular subclass type and returns true if it belongs to that instance else it will return 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: "sopd physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"), Chemistry(physics: "Thermo physics", equations: "Decibels"), Maths(physics: "Astro Physics", formulae: "MegaHertz"), Maths(physics: "Differential Equations", formulae: "Cosine Series")] let samplechem = Chemistry(physics: "sopd physics", equations: "Hertz") print("Instance physics is: (samplechem.physics)") print("Instance equation is: (samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") print("Instance physics is: (samplemaths.physics)") print("Instance formulae is: (samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { if item is Chemistry { ++chemCount } else if item is Maths { ++mathsCount } } print("Subjects in chemistry contains (chemCount) topics and maths contains (mathsCount) topics")
When we run the above program using playground, we get the following result −
Instance physics is: sopd physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz Subjects in chemistry contains 2 topics and maths contains 3 topics
Downcasting
Downcasting the subclass type can be done with two operators (as? and as!). as? returns an optional value when the value returns nil. It is used to check successful downcast.
as! returns force unwrapping as discussed in the optional chaining when the downcasting returns nil value. It is used to trigger runtime error in case of downcast failure
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: "sopd physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"), Chemistry(physics: "Thermo physics", equations: "Decibels"), Maths(physics: "Astro Physics", formulae: "MegaHertz"), Maths(physics: "Differential Equations", formulae: "Cosine Series")] let samplechem = Chemistry(physics: "sopd physics", equations: "Hertz") print("Instance physics is: (samplechem.physics)") print("Instance equation is: (samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") print("Instance physics is: (samplemaths.physics)") print("Instance formulae is: (samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { if let print = item as? Chemistry { print("Chemistry topics are: (print.physics) , (print.equations)") } else if let example = item as? Maths { print("Maths topics are: (example.physics) , (example.formulae)") } }
When we run the above program using playground, we get the following result −
Instance physics is: sopd physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz Chemistry topics are: sopd physics , Hertz Maths topics are: Fluid Dynamics , Giga Hertz Chemistry topics are: Thermo physics , Decibels Maths topics are: Astro Physics , MegaHertz Maths topics are: Differential Equations , Cosine Series
Typecasting: Any and Any Object
The keyword Any is used to represent an instance which belongs to any type including function types.
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: "sopd physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"), Chemistry(physics: "Thermo physics", equations: "Decibels"), Maths(physics: "Astro Physics", formulae: "MegaHertz"), Maths(physics: "Differential Equations", formulae: "Cosine Series")] let samplechem = Chemistry(physics: "sopd physics", equations: "Hertz") print("Instance physics is: (samplechem.physics)") print("Instance equation is: (samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") print("Instance physics is: (samplemaths.physics)") print("Instance formulae is: (samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { if let print = item as? Chemistry { print("Chemistry topics are: (print.physics) , (print.equations)") } else if let example = item as? Maths { print("Maths topics are: (example.physics) , (example.formulae)") } } var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Example for Any") exampleany.append(Chemistry(physics: "sopd physics", equations: "Hertz")) for print in exampleany { switch print { case let someInt as Int: print("Integer value is (someInt)") case let someDouble as Double where someDouble > 0: print("Pi value is (someDouble)") case let someString as String: print("(someString)") case let phy as Chemistry: print("Topics (phy.physics) , (phy.equations)") default: print("None") } }
When we run the above program using playground, we get the following result −
Instance physics is: sopd physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz Chemistry topics are: sopd physics , Hertz Maths topics are: Fluid Dynamics , Giga Hertz Chemistry topics are: Thermo physics , Decibels Maths topics are: Astro Physics , MegaHertz Maths topics are: Differential Equations , Cosine Series Integer value is 12 Pi value is 3.14159 Example for Any Topics sopd physics , Hertz
AnyObject
To represent the instance of any class type, AnyObject keyword is used.
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 saprint: [AnyObject] = [Chemistry(physics: "sopd physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"), Chemistry(physics: "Thermo physics", equations: "Decibels"), Maths(physics: "Astro Physics", formulae: "MegaHertz"), Maths(physics: "Differential Equations", formulae: "Cosine Series")] let samplechem = Chemistry(physics: "sopd physics", equations: "Hertz") print("Instance physics is: (samplechem.physics)") print("Instance equation is: (samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") print("Instance physics is: (samplemaths.physics)") print("Instance formulae is: (samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in saprint { if let print = item as? Chemistry { print("Chemistry topics are: (print.physics) , (print.equations)") } else if let example = item as? Maths { print("Maths topics are: (example.physics) , (example.formulae)") } } var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Example for Any") exampleany.append(Chemistry(physics: "sopd physics", equations: "Hertz")) for print in exampleany { switch print { case let someInt as Int: print("Integer value is (someInt)") case let someDouble as Double where someDouble > 0: print("Pi value is (someDouble)") case let someString as String: print("(someString)") case let phy as Chemistry: print("Topics (phy.physics) , (phy.equations)") default: print("None") } }
When we run the above program using playground, we get the following result −
Instance physics is: sopd physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz Chemistry topics are: sopd physics , Hertz Maths topics are: Fluid Dynamics , Giga Hertz Chemistry topics are: Thermo physics , Decibels Maths topics are: Astro Physics , MegaHertz Maths topics are: Differential Equations , Cosine Series Integer value is 12 Pi value is 3.14159 Example for Any Topics sopd physics , HertzAdvertisements