美文网首页程序员
Swift可选类型与as

Swift可选类型与as

作者: 奔跑的鸿 | 来源:发表于2020-06-09 22:25 被阅读0次

可选类型

  • Swift要求普通变量只有一种状态, 有值。即必须初始化,否则报错:
var nora: Int
nora = 10
print(nora)

//let num3: Int
//print("\(num3)")    Constant 'num3' used before being initialized

由于普通变量只有一种状态, 有局限性, 所以Swift设计了可选类型。

  • 可选类型(Optional)是一个含有两种情况的枚举,None 和 Some(T),用来表示可能有或可能没有值。
    格式: Optional<类型> 或者在类型后面加上?号。如下:
var opa: Optional<Int>
var opb: Int?

Swift 的 Int 类型有一种构造器,作用是将一个 String 值转换成一个 Int 值,然而该构造器可能会失败,所以它返回一个可选类型 optiona(Int),如下:

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型 "Int?", 或者类型 "optional (Int)"
  • 声明一个可选变量时没有提供初始值,它的值默认为nil。
    • Swift中nil不是指针,它是一个确定的值,用来表示值缺失。
    • 任何类型的可选状态都可以被设置为 nil,不只是对象类型。
    • nil 不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
  • 可选值:可选类型对应的值就叫可选值。可选值用optionals修饰,有两种状态: 1.有值 2.没有值, 没有值就是nil。
//有值
var optValue1: Int? = 9
//没有值
var optValue3: Int? = nil
var optValue2: Int?           //没有提供初始值,它的值默认为nil
  • 可选值可以用if语句来进行判断
var optValue1: Int? = 9
var optValue4: Int?
if optValue4 != nil
{
    print(optValue4 as Any)
}else
{
    //optValue1是可选变量,不作处理会有警告
    //确定optValue1有值的情况下,也可以这么处理:print(optValue1!)
    print(optValue1 as Any)    //输出Optional(9)。编译器会隐式强制将optional转换成as Any,不写有警告
}
  • 强制解析:确定可选类型确实包含值之后,可在可选变量后面加一个感叹号(!)来获取值。这个感叹号表示“我知道这个可选有值,请使用它”,此时编译器不会对该变量做检查。但是如果可选变量中没有值会引发一个运行错误
var optValue5: Int? = 10
var result1: Int = optValue5!
print(result1)        //输出10

//报错:
//var optValue6: Int?
//var result2: Int = optValue6!
//print(result2)
  • 可选绑定:即if let。为了安全的解析可选类型的值, 一般情况下使用可选绑定。
    如果optValue没有值,则不会做任何操作,不会执行大括号中的内容。如果opValue有值,则optValue的值会赋值给result3并执行大括号中的内容
var optValue7: Int?
optValue7 = 11
if let result3 = optValue7    //这里result3不需要写明类型,类型与optValue7保持一致
{
    print(result3)        //输出11
}
  • Swift中的可选类型变量更贴近于OC中的普通变量。
//OC普通变量
//NSData *data = [NSData .dataWithContentsOfMappedFile:@"/Users/hanjunqiang/Desktop/StudyEveryDay/H5/第一阶段/小说.html"];
//NSLog("%@", data);

//Swift可选类型
var data:NSData? = NSData(contentsOfFile: "/Users/hanjunqiang/Desktop/StudyEveryDay/H5/第一阶段/小说.html") //测试地址, 换成你自己路径地址文件即可
//print(data as Any)

Swift中的 as、as!、as? 三种操作符

  • as从派生类转换为基类,它是向上转型
class Person {}

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

// 定义一个学生对象 tom
var tom = Student("Tom");
// 把学生对象向上转型为一般的人员对象
let person1 = tom as Person
  • as!是向下转型,由于是强制类型转换,如果转换失败会报 runtime 运行错误
let person : Person = Teacher("Jimmy Lee")
let jimmy = person as! Teacher
  • 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可选类型与as

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