三种操作符怎么样选择,斯威夫特学习_类型检查符is和类型调换符as

Swift是苹果于201肆年发布的新开采语言,运维于Mac
OS和iOS平台,开拓基于苹果平台的应用程序。在运用斯威夫特语言的时候,大家通常会被
as、as!、as?三连串型转换操作符混淆,那里总计了二种操作符的用法。

Swift是苹果于201四年披露的新开垦语言,运转于Mac
OS和iOS平台,开拓基于苹果平台的应用程序。在利用Swift语言的时候,大家平日会被
as、as!、as?三种类型调换操作符混淆,这里总括了两种操作符的用法。

Swift – as、as!、as?叁种类型转换操作符使用详解(附样例)

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

应网民必要,小编那边总计了下 as、as!、as?
那叁连串型转换操作符的异同,以及分级的应用情状。

澳门葡京备用网址 1Swift

1. as

1. as

1,as使用场合

(壹)从派生类转变为基类,向上转型(upcasts)

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

(二)解决二义性,数值类型调换

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

(三)switch 语句中张开情势相配

假设不明了二个对象是如何项目,你能够经过switch语法检查评定它的品类,并且尝试在不一样的情状下采用相应的类型实行相应的拍卖。

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

类型检查操作符is,可以检查叁个目标是还是不是有些类的目标,假如是,则赶回true,否则再次回到false

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

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

2,as!使用场馆

三种操作符怎么样选择,斯威夫特学习_类型检查符is和类型调换符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)
// 定义人员基类
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)

3,as?使用场地

as? 和 as! 操作符的转变规则完全等同。但 as?
假设转变不成事的时候便会回去2个 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

类型转换时将2个类型转变为此外三个品种,可是前提是有继续关系的,对象的连串之间才能够转移,将子类调换到父类,是升高转变,一般都会转变到功,将父类调换来子类是向下更动,只怕会战败

类型转变的操作符有三种样式:as?和as!,条件方式as?重回目的项目的可选值,强制方式as!把向下转型和强制解包转型结果结合为一个操作

as!操作符是类型转换的强制格式,如若得以转变,则会回来转换了格式的靶子,假若不可能转移就会抛出运营时不当。因而只有整套规定可以调换,不然不应有利用as!来开始展览强制类型转换。

和is操作符卓殊接近,类型调换的平整是,某些类的靶子能够转移为协调这些类,子类能够升高转变为超类,但超类无法向下更换为子类。除非有个别子类的靶子表现情势为超类,但实则是子类,这时能够利用as!举办向下转移。

运维结果:
此人的名字是: 汤姆
本条人的名字是: 凯文 Jakson

运作结果:
本条人的名字是: 汤姆
其一位的名字是: 凯文 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)") }}

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

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

壹.先是试图将 item 下转为 Movie 。因为 item 是三个 MediaItem 类型的实例,它大概是多少个 Movie ;一样,它也大概是一个 Song ,大概仅仅是基类 MediaItem 。因为不明确, as? 情势在试图下转时将回到 八个可选值。 item as? Movie 的重回值是 Movie? 大概说“可选 Movie ”。
let age = 28 as Int
let money = 20 as CGFloat
let cost = (50 / 2) as Double
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 类型。若成功,设置1个新的一时半刻常量 movie
来囤积重返的可选 Movie 中的 值”

(3)switch 语句中张开格局相配
透过switch语法检查评定对象的品类,依据目的类型实行管理。

(三)switch 语句中实行形式相配
通过switch语法检测对象的种类,依据目的类型进行拍卖。

三.若向下转型成功,然后 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
}
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类型,打字与印刷学生成绩单…

运转结果:
是Student类型,打字与印刷学生战表单…

澳门葡京备用网址 ,2.二. 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!

2. as!

代码已上传至git:

向下转型(Downcasting)时选取。由于是威胁类型转换,要是转变败北会报
runtime 运维错误。

向下转型(Downcasting)时接纳。由于是挟持类型转变,纵然调换战败会报
runtime 运营错误。

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

3. as?

3. as?

as? 和 as! 操作符的转变规则完全平等。但 as?
假设转换不成事的时候便会回来1个 nil 对象。成功的话重临可选类型值。由于
as?
在转移战败的时候也不会并发谬误,所以对于若是能保障百分之百会成功的转变则可接纳as!,不然使用 as?

as? 和 as! 操作符的转变规则完全1致。但 as?
要是转换不成事的时候便会回去3个 nil 对象。成功的话重临可选类型值。由于
as?
在转移退步的时候也不会冒出错误,所以对于借使能确定保证百分百会水到渠成的转换则可利用
as!,不然使用 as?

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

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

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

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

运维结果:
以这厮是导师,
名字是 吉姆my Lee

 

 

相关文章

发表评论

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

*
*
Website