叁类别型转变操作符使用详解,Swift学习_类型检查符is和类型转换符as

叁类别型转变操作符使用详解,Swift学习_类型检查符is和类型转换符as。Swift是苹果于2014年宣布的新开拓语言,运维于Mac
OS和iOS平台,开采基于苹果平台的应用程序。在选择斯威夫特语言的时候,大家平常会被
as、as!、as?3连串型调换操作符混淆,这里总计了三种操作符的用法。

Swift – as、as!、as?3体系型调换操作符使用详解(附样例)

总结:
? 表示可选值, !表示调换来功,明确有值

应网络朋友须求,作者那边总括了下 as、as!、as?
那三种类型转换操作符的异同,以及分级的运用情况。

澳门葡京备用网址 1Swift

1. as

一,as使用场馆

(一)从派生类调换为基类,向上转型(upcasts)

class Animal {}
class Cat: Animal {}
let cat = Cat()
let animal = cat as Animal

(2)化解二义性,数值类型转变

let num1 = 42 as CGFloat
let num2 = 42 as Int
let num3 = 42.5 as Int
let num4 = (42 / 2) as Double

(3)switch 语句中实行情势相配

假如不精通1个对象是何许项目,你能够因而switch语法检查评定它的项目,并且尝试在不一样的情景下利用相应的花色实行对应的管理。

switch animal {
case let cat as Cat:
    print("如果是Cat类型对象,则做相应处理")
case let dog as Dog:
    print("如果是Dog类型对象,则做相应处理")
default: break
}

花色检查操作符is,能够检查二个对象是否有些类的对象,假如是,则赶回true,不然再次来到false

(1)从派生类转换为基类,向上转型(upcasts)

2,as!使用场面

向下转型(Downcasting)时采纳。由于是强制类型调换,尽管转变战败会报
runtime 运转错误。

class Animal {}
class Cat: Animal {}
let animal :Animal  = Cat()
let cat = animal as! Cat
class Person{ var name:String? init(name:String) { self.name = name; }}class Employee: Person { var company:String init(name:String,company:String) { self.company = company super.init(name: name) }}class Student: Person { var school:String? init(name:String,school:String) { self.school = school super.init(name: name) }}let employee1 = Employee(name:"张三",company:"apple公司")let employee2 = Employee(name:"李四",company:"google公司")let student1 = Student(name:"小明",school:"中关村一小")let student2 = Student(name:"小花",school:"中关村二小")let student3 = Student(name:"小路",school:"中关村二小")let members = [employee1,employee2,student1,student2,student3];var employeeCount = 0var studentCount = 0for item in members{ if item is Employee{ employeeCount += 1; }else if item is Student{ studentCount += 1; } }print("职员的人数:\(employeeCount)人") // 打印 职员的人数:2人print("学生的人数:\(studentCount)人") // 打印 学生的人数:3人
// 定义人员基类
class Person {
    var name : String

    init(_ name: String){
        self.name = name
    }
}

// 定义学生类
class Student : Person {
}

// 定义教师类
class Teacher : Person {
}

// 处理人员对象的函数(或工厂模式处理操作等)
func showPersonName(_ people : Person){
    let name = people.name
    print("这个人的名字是: \(name)")
}

// 定义一个学生对象 tom
var tom = Student("Tom");

// 定义一个教师对象 kevin
var kevin = Student("Kevin Jakson");

// 先把学生对象向上转型为一般的人员对象
let person1 = tom as Person
let person2 = kevin as Person

// 再调用通用的处理人员对象的showPersonName函数
showPersonName(person1)
showPersonName(person2)

三,as?使用场面

as? 和 as! 操作符的转变规则完全平等。但 as?
假使转变不成功的时候便会回到3个 nil
对象。成功的话重返可选类型值(optional),必要我们拆包使用。
是因为 as?
在调换退步的时候也不会现出谬误,所以对于如果能担保百分之百会成功的调换则可利用
as!,不然使用 as?

let animal:Animal = Cat()

if let cat = animal as? Cat{
    print("cat is not nil")
} else {
    print("cat is nil")
}

原稿出自:www.hangge.com
转发请保留原版的书文链接:http://www.hangge.com/blog/cache/detail\_1089.html

类型调换时将3个类型转变为其它1个门类,不过前提是有承袭关系的,对象的品类之间才得以转变,将子类转变来父类,是升高转变,一般都会转移成功,将父类转变到子类是向下转移,可能会退步

类型转变的操作符有二种样式:as?和as!,条件情势as?重临目的项目标可选值,强制格局as!把向下转型和威逼解包转型结果结合为2个操作

as!操作符是类型转换的强制格式,如果能够转移,则会回来调换了格式的对象,如若无法转变就能够抛出运行时不当。因此唯有整套分明能够转移,不然不该使用as!来开始展览强制类型转变。

和is操作符非凡周边,类型转变的规则是,有个别类的目标足以转换为和睦那些类,子类可以发展转换为超类,但超类不可能向下更动为子类。除非某些子类的对象表现情势为超类,但实在是子类,那时能够利用as!进行向下转移。

运行结果:
本条人的名字是: 汤姆
其1人的名字是: 凯文 Jakson

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")]var movieCount = 0var songCount = 0for 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)") }}

(二)消除二义性,数值类型调换

1.首先试图将 item 下转为 Movie 。因为 item 是3个 MediaItem 类型的实例,它可能是贰个 Movie ;同样,它也说不定是多少个 Song ,也许只有是基类 MediaItem 。因为不鲜明, as? 格局在希图下转时将回来 1个可选值。 item as? Movie 的再次回到值是 Movie? 也许说“可选 Movie ”。
let age = 28 as Int
let money = 20 as CGFloat
let cost = (50 / 2) as Double
贰.当向下转型为 Movie 应用在多个 Song 实例时将会倒闭。为了管理这种场馆,上边包车型客车例证使用了可选绑定(op tional binding)来检查可选 Movie 真的含有3个值(这些是为了认清下转是不是成功。)可选绑定是那样写 的“ if let movie = item as? Movie ”,能够如此解读:

“尝试将 item 转为 Movie 类型。若成功,设置四个新的权且常量 movie
来存款和储蓄重回的可选 Movie 中的 值”

(三)switch 语句中张开格局匹配
通过switch语法检查实验对象的品类,依照目标类型实行管理。

3.若向下转型成功,然后 movie 的性质将用来打字与印刷三个 Movie 实例的描述,包蕴它的监制的名字 directo r 。相似的规律被用来检查测试 Song 实例,当 Song 被找到时则打字与印刷它的叙说(包蕴 artist 的名字)。

注意改换没有当真退换实例或它的值。根本的实例保持不改变;只是简短地把它当作它被调换来的档期的顺序来使用。

switch person1 {
    case let person1 as Student:
        print("是Student类型,打印学生成绩单...")
    case let person1 as Teacher:
        print("是Teacher类型,打印老师工资单...")
    default: break
}

二.壹. as!使用场面

向下转型(Downcasting)时使用。由于是挟持类型调换,假诺转变失利会报运营错误。

class Animal { }class Cat: Animal { }let animal:Animal = Cat()let cat = animal as! Catprint("as! --- \

运营结果:
是Student类型,打字与印刷学生成绩单…

贰.二. as?使用场地

as? 和 as! 操作符的转变规则完全同样。但 as?
要是转换不成事的时候便会回去1个 nil
对象。成功的话再次来到可选类型值,须要大家拆包使用。由于 as?
在调换失败的时候也不会冒出错误,所以对于即使能担保百分百会中标的转变则可利用
as!,不然使用 as?

let animal1:Animal = Cat()if let cat = animal1 as? Cat{ print("as? --- \}else{ print("cat is nil")}

澳门葡京备用网址 2类型调换as操作符结果输出

2. as!

代码已上传至git:

向下转型(Downcasting)时利用。由于是挟持类型调换,要是调换失利会报
runtime 启动错误。

–> 传送门:Swift_主干语法
let person : Person = Teacher("Jimmy Lee")
let jimmy = person as! Teacher

3. as?

as? 和 as澳门葡京备用网址,! 操作符的转换规则完全等同。但 as?
就算转变不成事的时候便会再次来到四个 nil 对象。成功的话重返可选类型值。由于
as?
在调换失利的时候也不会并发错误,所以对于假使能保险100%会成功的转移则可接纳as!,不然使用 as?

let person : Person = Teacher("Jimmy Lee")

if let someone = person as? Teacher{
    print("这个人是教师, 名字是 \(someone.name)")
} else {
    print("这个人不是教师, 'tom'的值是 nil")
}

运营结果:
其1个人是教员,
名字是 吉米my Lee

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website