Swift学习笔记之可选类型

和OC相比

可选类型是一个从OC走向Swift的第一个吸引目光的地方,OC是弱类型语言,所以没有可选类型的概念。

可选类型的解绑

首先看声明可选类型:

var optionalStr:String?

Swift中任何类型都可以紧跟一个?变为可选类型
声明后我们赋值打印试试:

optionalStr = "Hello,Swift"

print(optionalStr)

编译器报警告,然后打出的结果是"Optional("Hello,Swift")"而不是我们预期的"Hello,Swift"。

下面有列举几种解除警告的方法:
1.空合运算

print(optionalStr ?? "默认值")

使用空合运算符??为可选类型指定一个默认值,保证它不为空,就不会有警告了。
2.强制解析

print(optionalStr!)

强行告诉编译器,它有值不为空。

  1. 转换类型
print(optionalStr as Any)

as是表示转换成它对应的类型,转换成一个可以为空的类型Any,自然不会警告了。
4.自动解析
声明的时候直接用!

var optionalStr:String!

optionalStr依然是可选类型,只是当我们使用它的时候,它自动解析为String类型了。
5.可选绑定

if let tempStr = optionalStr {
    print(tempStr)
}else{
    print("为nil")
}

if let 指的是如果optionalStr有值就给tempStr,为nil就else;

可选类型的应用

知道这么多解绑方法之后,相信你已经迫不及待想用用看了。接下来列举场景的几个应用场景:
1.返回值类型

func returnoptionalValue(value: Bool) -> String? { // 返回类型为可选String类型
    if value {
        return "返回类型是可选类型值"
    } else {
        return nil
    }
}
func returnoptionalFunc(value: Bool) -> (() -> (Void))? { // 返回类型为可选类型的闭包
    if value {
        return { () in
            print("返回类型是可选类型闭包")
        }
    } else {
        return nil
    }
}

不多解释,试试怎么解绑。
2.作为属性

//类
class OptionalClass {
    var aValue: Int = 0
    var optionaValue: String? //默认值为nil
}
//结构体
struct OptionalStruct {
    var aValue: Int
    var optionalValue: String? //默认值为nil
}

这样做的话构造方法中可以不对optionalValue属性初始化
3.可失败构造器

class OptionalStructInit {
    let aValue: String
    init?(aValue: String) {
        if aValue.isEmpty { return nil }
        self.aValue = aValue
    }
}

class OptionalStructInit实例化后可能为nil(作死?)
4.try

var optionalStr = try? aFunction()

try?会将Error转换为可选值,当调用aFunction时,如果aFunction抛出错误,程序不会发崩溃,而返回一个nil,如果没有抛出错误则返回可选值。
使用try!可以强行崩溃(作死?)

以上就是Swift可选类型的学习记录,欢错指。

你可能感兴趣的:(Swift学习笔记之可选类型)