美文网首页
Swift as ! ? 区别总结

Swift as ! ? 区别总结

作者: 凛冬将至2002 | 来源:发表于2019-05-30 16:50 被阅读0次

?含义

Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"。
Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种声明是相等的:

var optionalInteger: Int?
var optionalInteger: Optional<Int>

当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为 nil。
如果一个可选类型的实例包含一个值,你可以用后缀操作符 !来访问这个值,如下所示

optionalInteger = 88
optionalInteger! // 88

注意:使用操作符!去获取值为nil的可选变量会有运行时错误。
可选类型类似于Objective-C中指针的nil值,但是nil只对类(class)有用,而可选类型对所有的类型都可用,并且更安全。

!含义

!当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。表示“我知道这个可选类型有值,请使用它” ,或者可以理解为可选值的强制解析

import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil {
   print(myString)
}else{
   print("myString 值为 nil")
}
//以上程序执行结果为:
//Optional("Hello, Swift!")

强制解析可选值,使用感叹号(!):

import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil {
   // 强制解析
   print( myString! )
}else{
   print("myString 值为 nil")
}
//程序执行结果:
//Hello, Swift!

注意:使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。

as ,as?,as!

as:

  • 从派生类转换为基类,向上转型(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 = Student("Kevin Jakson");

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

// 再调用通用的处理人员对象的showPersonName函数
showPersonName(person1)
showPersonName(person2)
  • 消除二义性,数值类型转换
let age = 28 as Int
let money = 20 as CGFloat
let cost = (50 / 2) as Double
  • switch 语句中进行模式匹配,通过switch语法检测对象的类型,根据对象类型进行处理。
switch person1 {
    case let person1 as Student:
        print("是Student类型,打印学生成绩单...")
    case let person1 as Teacher:
        print("是Teacher类型,打印老师工资单...")
    default: break
}

as!

向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。

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

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")
}

相关文章

  • 关于Swift的一点点总结

    关于Swift的一点点总结 Welcome to Swift!! Swift与OC的区别(只适合新手看,因为我也是...

  • Swift as ! ? 区别总结

    ?含义 Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x ...

  • OC与swift的区别

    OC与Swift的区别一(文件结构) OC与Swift的区别一(常量、变量、运算符) OC与Swift的区别三(条...

  • Swift Review总结一:从 Swift Style 开始

    Swift Review总结一:从 Swift Style 开始 Swift Review总结一:从 Swift ...

  • OC与Swift的主要区别

    swift与OC的主要区别就是语法区别,其他大抵相同. 区别1: swift中使用let定义常量,var定义变量....

  • swift面试题(面试指南)

    总结关于swift的面试题------持续更新 来源于网上、书籍等 1.Class 和 Struct 的区别 类是...

  • swift 那点小事(一)

    swift是一门强语言,很多地方比OC写的要严谨的多。今天总结一下swift和OC的区别,以及一些融通易犯错的地方...

  • Swift语言基础

    //Swift 与 OC 的区别

  • Swift最新语法总结

    swift最新语法总结(函数) swift最新语法总结(枚举类型与结构体) swift最新语法总结(类的使用) s...

  • swift5版本学习

    swift与OC区别:swift与OC1、Swift容易阅读,语法和文件结构简易化。2、Swift更易于维护,文件...

网友评论

      本文标题:Swift as ! ? 区别总结

      本文链接:https://www.haomeiwen.com/subject/lnsvtctx.html