import UIKit
class OptionValue: NSObject {
// var version : String
override init() {
super.init()
}
//可选项的基本概念
func useOptionFeature() {
/*
可选项用于做值缺失处理的一种语法
oc中是没有可选项的概念的,但oc中的对象类型是可以设置为nil的,且oc中的nil不能用于除对象类型的数据
swift中可选项用?来修饰,如下:
*/
let name : String? = "Array"
//name这个常量是String类型的,?的含义:等号右边有值吗?如果有则name等于这个值,如果没有则name=nil
//可选项在展开后才可以用它的值,可选项展开使用符号!
// print("name = \(name)") //这样写是有警告信息的
print("name = \(String(describing: name))") // 打印时这样写才正确
//可以通过if语句,来判断可选项的常量是否为空
if let new_name = name{
print("the option value is not nil, new_name = \(new_name)")
// the option value is not nil, new_name = Array
}
//注:swift中只有可选项类型才可以置为nil
var value1 : String = "sum"
// value1 = nil //这样写是报错的
//注:如果声明的可选类型没有提供默认值,会自动置为nil
let value2 : Int?
// print("value2 = \(value2)") // Constant 'value2' used before being initialized
}
//在某些场景下,使用可选项是非常安全的
func useOptionFeatureOne(){
//因为swift有类型推断,类型间的转换有时候不是很明确
let num1 = 22
let str1 = "abc"
let string_one : Int = Int(num1)
// let value_one : Int = Int(str1) //这样写是会报错的,因为str1是不能强转成为Int类型的值的
//这种情况使用可选项很有必要
let value_one : Int? = Int(str1)
print("value_one = \(String(describing: value_one))")
}
//if语句以及强制展开
func useOptionFeatureTwo() {
let value1 : Int? = 20
if value1 != nil{
//可选项修饰的类型,后边加!,是强制展开的意思,即我跟编译器说,我知道这里有值,强制展开吧,赋值为20了
print("value1 = \(value1!)")
}
}
//控制流中的可选项绑定
func useOptionFeatureThree() {
//value1的值不为nil时,会把值赋给string_one
let value1 : String? = "pem"
if let string_one = value1 {
print("string_one = \(string_one)")
}
}
//隐式展开可选项
func useOptionFeatureFour(){
/*
有时在一些程序结构中可选项一旦被设定值之后,就会一直拥有值。在这种情况下,就可以去掉检查的需求,也不必每次访问的时候都展开,因为它可以安全的确认每次访问的时候都有一个值,这种类型的可选项被定义为隐式展开的可选项,通过在声明的类型后边添加一个叹号!来书写隐式展开的可选项
*/
//隐式展开的可选项主要被用在swift类的初始化过程
//可选项展开
let possibleString : String? = "An optional string"
let forcedString : String = possibleString!
print("forcedString = \(forcedString)") //forcedString = An optional string
//隐式可选项展开
let assumedString : String! = "An implicitly unwrapped string"
let implicitString : String = assumedString
print("implicitString = \(implicitString)")
//implicitString = An implicitly unwrapped string
}
//Optional-可选链
func useOptionFeatureFive() {
let str1 : String? = "abc"
let count = str1?.count // 此时count也为可选项类型
if count != nil {
let lastIndex = count! - 1
print("lastIndex = \(lastIndex)") // lastIndex = 2
}
}
}
|