《Swift学习笔记》04 - 可选类型简介

2019-07-30  本文已影响0人  ShIwEn9

介绍:Swift 语言由苹果公司在 2014 年推出,用来撰写 Mac OS 和 iOS 应用程序,并且Swift还是开源的,开源地址:https://github.com/apple/swift,同时附上官方博客地址:https://swift.org
目前Swift已经发展到了第五版本。显然苹果大有推翻 OC “江山”的意思.
今天就来初探一下Swift,看看究竟为何swift有这么大的能力。
参考内容:
Swift中文
YungFan老师

swift
1. 可选类型的介绍( options ):

开发中碰到nil在所难免.因此推出了可选类型。可以利用可选类型来处理值可能缺失的情况。

2. 定义可选类型
let numOne : Optional<String> = nil
let numTwo : String? = nil
let numThree : String?
let numThree2 : Any?
let url : URL? = URL(string: "https://www.abc.edu.cn")
let name3 : String! = nil
let name4 : Any! = nil

注意⚠️: nil 不能用于非可选的常量或者变量,如果你的代码中变量或常量需要作用于特定条件下的值缺失,可以给他声明为相应类型的可选项。

Swift 中的 nil 和Objective-C 中的 nil 不同,在 Objective-C 中 nil 是一个指向不存在对象的指针。在 Swift中, nil 不是指针,他是值缺失的一种特殊类型,任何类型的可选项都可以设置成 nil 而不仅仅是对象类型。

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
print("convertedNumber = \(convertedNumber)")
// convertedNumber is inferred to be of type "Int?", or "optional Int"
可以看到输出的结果是 可选的Int,而不是Int 可选的 Int 写做 Int?,而不是Int 。问号明确了它储存的值是一个可选项,意思就是说它可能包含某些 Int 值,或者可能根本不包含值。(他不能包含其他的值,例如 Bool 值或者 String 值。它要么是 Int 要么什么都没有)
3. 可选类型的使用
// 定义可选类型
var string : Optional<String> = nil

// 给可选类型赋值
// 错误写法:因此该可选类型中只能存放字符串
string = 123
// 正确写法:
string = "Hello world"

// 打印结果
print(string)
// 结果:Optional("Hello world")\n  因为是可选类型,所有会带Optional
4. If 语句以及强制展开(强制解包)

强制解包有两种:

var string : Optional<String> = " hello swift ! "

//方法一 :通过 If 来强制解包 相对而言更加的安全。
if string != nil {
    print(string!)
}

// 方法二 :当知道 可选值为非空的时候使用;
//!强制解包(显示解包)
print(string!)

// 当可选值为空的时候会报错
var string2 : Optional<String> = nil
print(string2!) // 报错 EXC_BAD_INSTRUCTION
5. 可选项绑定

在 if 语句中,这样书写可选绑定:

if let constantName = someOptional { 
    statements 
} 

上面说到,类型的转换会被默认为 可选类型 ,我们可以通过可选类型的绑定来 展开 可选类型

let convertedNumber = Int(possibleNumber)
print("convertedNumber = \(convertedNumber)")

if let actualNumber = convertedNumber {
    print("actualNumber = \(actualNumber)")
}
print: actualNumber = 123,convertedNumber = Optional(123)

代码可以读作:
“如果 Int(possibleNumber) 返回的可选Int包含一个值,将这个可选项中的值赋予一个叫做 actualNumber 的新常量。”

常量和变量都可以使用可选项绑定,如果你想操作 if 语句中第一个分支的 actualNumber的值,你可以写if var actualNumber来代替,可选项内部包含的值就会被设置为一个变量而不是常量。

你可以在同一个if语句中包含多可选项绑定,用逗号分隔即可。如果任一可选绑定结果是nil或者布尔值为 false ,那么整个 if 判断会被看作 false 。下面的两个 if 语句是等价的:

if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
    print("\(firstNumber) < \(secondNumber) < 100")
}
// Prints "4 < 42 < 100"
 
if let firstNumber = Int("4") {
    if let secondNumber = Int("42") {
        if firstNumber < secondNumber && secondNumber < 100 {
            print("\(firstNumber) < \(secondNumber) < 100")
        }
    }
}
// Prints "4 < 42 < 100"
guard let str = Int(possibleNumber) else{
    return
}
print(str)
6. 隐式展开可选项(隐式解包)

如上所述,可选项明确了常量或者变量可以“没有值”。可选项可以通过if语句来判断是否有值,如果有值的话可以通过可选项绑定来获取里边的值。
有时在一些程序结构中可选项一旦被设定值之后,就会一直拥有值。在这种情况下,就可以去掉检查的需求,也不必每次访问的时候都进行展开,因为它可以安全的确认每次访问的时候都有一个值。
这种类型的可选项被定义为隐式展开可选项。通过在声明的类型后边添加一个叹号( String! )而非问号( String? ) 来书写隐式展开可选项
隐式展开可选项是后台场景中通用的可选项,但是同样可以像非可选值那样来使用,每次访问的时候都不需要展开。下面的栗子展示了在访问被明确为 String 的可选项展开值时,可选字符串和隐式展开可选字符串的行为区别:

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark
 
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark

你可以把隐式展开可选项当做在每次访问它的时候被给予了自动进行展开的权限,你可以在声明可选项的时候添加一个叹号而不是每次调用的时候在可选项后边添加一个叹号。

你可以像对待普通可选一样对待隐式展开可选项来检查里边是否包含一个值:

if assumedString != nil {
    print(assumedString)
}

你也可以使用隐式展开可选项通过可选项绑定在一句话中检查和展开值:

if let definiteString = assumedString {
    print(definiteString)
}
// prints "An implicitly unwrapped optional string."

可选类型的介绍就到这里了。有什么不足的地方欢迎补充。文章大多数内容来自:

Swift中文
YungFan老师
再次感谢!

求职广告:本人实习生,现在急需一份工作,杭州南京合肥的都可以。对我感兴趣的可以私聊我 0.0。谢谢~~~

上一篇 下一篇

猜你喜欢

热点阅读