澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

三种类型转换操作符使用详解,Swift学习_类型检

2019-07-15 作者:www.8455.com   |   浏览(71)

Swift是苹果于2015年发表的新开辟语言,运转于Mac OS和iOS平台,开拓基于苹果平台的应用程序。在运用斯威夫特语言的时候,大家平日会被 as、as!、as?三连串型调换操作符混淆,这里总括了三种操作符的用法。

Swift - as、as!、as?三连串型调换操作符使用详解(附样例)

总结:
? 表示可选值, !表示调换到功,肯定有值

应网络朋友要求,作者这里计算了下 as、as!、as? 那三连串型转变操作符的异同,以及个别的行使境况。

澳门新萄京官方网站 1Swift

1. as

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

// 定义人员基类
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 = Teacher("Kevin Jakson");

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

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

运营结果:
其一个人的名字是: Tom
本条人的名字是: Kevin Jakson

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

let age = 28 as Int
let money = 20 as CGFloat
let cost = (50 / 2) as Double

(3)switch 语句中举办情势相称
透过switch语法检查评定对象的品种,依照目的类型进行处理。

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

澳门新萄京官方网站,运作结果:
是Student类型,打字与印刷学生战绩单...

1. as

1,as使用场合

(1)从派生类调换为基类,向上转型(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 语句中打开形式相配

万一不知道三个对象是怎么样类型,你能够经过switch语法检查测量试验它的花色,而且尝试在不一致的情事下接纳相应的档期的顺序进行对应的拍卖。

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

项目检查操作符is,能够检查贰个对象是否有些类的目的,若是是,则赶回true,不然再次回到false

2. as!

向下转型(Downcasting)时选拔。由于是强制类型调换,倘使转变退步会报 runtime 运营错误。

let person : Person = Teacher("Jimmy Lee")
let jimmy = person as! Teacher

(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人

3. as?

as? 和 as! 操作符的调换法规完全同样。但 as? 假诺调换不成功的时候便会回来二个 nil 对象。成功的话重临可选类型值。由于 as? 在转移失利的时候也不会冒出谬误,所以对于借使能保险百分之百会马到成功的改变则可应用 as!,不然使用 as?

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

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

运维结果:
以这个人是教员, 名字是 吉姆my Lee

小说仿效自简轻巧单的代码Infiniti的换代

// 定义人员基类
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? 假如转变不成事的时候便会回来一个 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

类型调换时将三个类型转变为别的二个类型,可是前提是有连续关系的,对象的品类之间才得以转移,将子类调换来父类,是升高转变,一般都会转变来功,将父类调换到子类是向下转移,也许会倒闭

类型调换的操作符有两种样式:as?和as!,条件形式as?重回指标项目标可选值,强制情势as!把向下转型和强制解包转型结果结合为八个操作

as!操作符是类型转变的劫持格式,如若得以转移,则会重返转变了格式的靶子,若是无法转换就能够抛出运转时不当。由此只有整套规定可以转变,不然不应有采纳as!来进展强制类型转变。

和is操作符特别类似,类型转变的条条框框是,有个别类的对象能够调换为温馨那一个类,子类能够升高调换为超类,但超类无法向下改造为子类。除非某些子类的靶子表现情势为超类,但实则是子类,那时能够应用as!进行向下更动。

运营结果:
以这个人的名字是: 汤姆
此人的名字是: 凯文 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)消除二义性,数值类型调换

1.首先试图将 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
2.当向下转型为 Movie 应用在七个 Song 实例时将会战败。为了管理这种场合,下边的例子使用了可选绑定(op tional binding)来检查可选 Movie 真的包括二个值(这几个是为了认清下转是或不是中标。)可选绑定是那样写 的“ if let movie = item as? Movie ”,能够如此解读:

“尝试将 item 转为 Movie 类型。若成功,设置三个新的不常常量 movie 来囤积重临的可选 Movie 中的 值”

(3)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
}

2.1. as!使用地方

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

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

运行结果:
是Student类型,打印学生成绩单...

2.2. as?使用场面

as? 和 as! 操作符的调换准则一模一样。但 as? 假诺转变不成事的时候便会回来一个 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_三种类型转换操作符使用详解,Swift学习_类型检查符is和类型转换符as。主导语法
let person : Person = Teacher("Jimmy Lee")
let jimmy = person as! Teacher

3. as?

as? 和 as! 操作符的转变准则完全等同。但 as? 若是转换不成事的时候便会回到三个 nil 对象。成功的话再次回到可选类型值。由于 as? 在调换败北的时候也不会现出谬误,所以对于倘诺能担保百分之百会中标的转移则可选用as三种类型转换操作符使用详解,Swift学习_类型检查符is和类型转换符as。!,不然使用 as?

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

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

运营结果:
其一个人是导师, 名字是 Jimmy Lee

 

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:三种类型转换操作符使用详解,Swift学习_类型检

关键词:

  • 上一篇:没有了
  • 下一篇:没有了