Swift语言入门 可选类型的含义、声明和使用场景
// 可选类型
var hello = “Hello,world!”
var stringToNumber = Double(hello)
// 结果为 nil ,就是没有的意思(因为这个字符串眼转换成数字类型的话,毫无规律可言是无法转换的。
var stringOfNumber = “123”
stringToNumber = Double(stringOfNumber)
print(stringToNumber)
//此时输出的值带有一个Optional,是因为将字符串类型转换成数字类型时有两种情况,第一种情况:当字符串的内容不是数字的时候,这种情况是无法转换的;第二种情况:当字符串的内容是数字的时候,这种情况下是能够转换成功的。也就是说字符串类型能否转换成数字类型是不确定的
//stringToNumber = Double(stringOfNumber)这一行代码中Double(stringOfNumber)其实就是一个Double型的可选类型(可通过option键来查看stringToNumber的类型)
//可选类型的表示方式 :一个特定类型加上一个问号
//当可选类型没有值的时候,会被赋予一个特殊的值nil,代表没有值;当可选类型有值的时候,就会返回一个可选类型的值,当转换成功的时候,返回的值就会被optional包裹起来
//人为声明可选类型的值 :只需在类型标注后加上问号就可以了
var job: String?
//⚠️注意:可选类型是不能够进行推断的,所以必须要进行类型标注;当我们申明可选类型的时候,如果没有对其进行赋值的话,她的值就默认为nil
// 强制解析 (可选类型的展开)
var optionalNumber: Int? = 2
var sum = optionalNumber + 3
/* 报错的原因是我们在使用可选类型的时候,没有将它们展开,那么如何把值展开呢?
报错的标志中有一个b白色的小圆点,表示Xcode可以为我们的错误提供一些解决方案
点击后看到,其建议我们在可选类型的值后面加上一个感叹号,这样就可以将我们的可选类型展开了*/
var optionalNumber: Int? = 2
var sum = optionalNumber! + 3
print(optionalNumber!)
// 展开后的值,输出的结果和正常的类型的没有什么区别,所以展开后就可以当作一个正常的Int类型来使用了;如果没有展开的话,就是一个可选类型的值,是不能够使用的
//这段代码之所以出现黄色的警告,是因为其在使用可选类型的时候没有展开,意味着代码有误,但还不至于导致程序崩溃
//print(job!) ** 空的可选类型无法展开**
// job没有值的时候是无法展开的,因为对可选类型的展开意味着你要去使用它,但当可选类型没有值的时候是无法使用它的
//第32行代码中出现警告,但黄色三角形中有一个小白点,可以查看解决方案
// 空合运算符
// 作用 :对可选类型进行判断,当可选类型为nil时,就会使用这个默认值;当可选类型有值的时候,就会自动将可选类型的值展开并且使用它
print(job ?? “没有工作”) //第一种解决方案: 提供一个默认值(default value)
job = “工程师”
print(job ?? “没有工作”)
//可选绑定
var optionalDouble: Double? = 2.5
if let optionalDouble = optionalDouble {
print(“可选类型optionalInt有值,值为(optionalDouble)”)
}
// 可选绑定语法 :对可选类型进行判断,如果有值的话,会自动将其展开,然后将展开后的值赋给一个常量,在可选语句范围内,这个常量就能当作正常的数据类型来使用了;如果可选类型没有值的话,这段代码就会被跳过,不被执行
// ⚠️注意:let double 这个常量是局部常量,只有在花括号内才有效
func redister(username: String?, password: String?) -> String {
if let username = username{
if let password = password {
return “注册成功,用户名(username),密码(password)”
} else {
return “密码未填写”
}
}else {
return “用户名未填写”
}
}
redister(username: “admin”, password: nil)
redister(username: “admin”, password: “123456”)
//guard语句的可选绑定
func redister(username: String?, password: String?) -> String {
guard let username = username else{
return “用户名未填写”
}
guard let password = password else{
return “密码未填写”
}
return “注册成功,用户名(username),密码(password)”
}
redister(username: “admin”, password: nil)
redister(username: “admin”, password: “123456”)
|
请发表评论