美文网首页
Swift之数据类型

Swift之数据类型

作者: 雪_晟 | 来源:发表于2017-11-21 14:21 被阅读4次

数据类型

有常量let,变量var,可以声明类型标注(需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称)

var welcomeMessage: String
let maximumNumberOfLoginAttempts = 10

输出

你可以用 print(_:separator:terminator:) 函数来输出当前常量或变量的值: print(friendlyWelcome)
// 输出 "Bonjour!"
print(_:separator:terminator:) 是一个用来输出一个或多个值到适当输出区的全局函数。
如果你用 Xcode, int(_:separator:terminator:) 将会输出内容到“console”面板上。
separator 和 terminator 参数具有默认 值,因此你调用这个函数的时候可以忽略它们。
默认情况下,该函数通过添加换行符来结束当前行。
如果不想换 行,可以传递一个空字符串给 terminator 参数--例如, print(someValue, terminator:"") 。

Swift 用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。
将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:

print("The current value of friendlyWelcome is \(friendlyWelcome)") // 输出 "The current value of friendlyWelcome is Bonjour!

整数,浮点数以及转换(同OC)。

整数就是没有小数部分的数字,比如 42 和 -23 。整数可以是 有符号 (正、负、零)或者 无符号 (正、零)。
Swift 提供了8,16,32和64位的有符号和无符号整数类型。
这些整数类型和 C 语言的命名方式很像,比如8位无 符号整数类型是 UInt8 ,32位有符号整数类型是 Int32 。
就像 Swift 的其他类型一样,整数类型采用大写命名 法。
除非你需要特定长度的整数,一般来说使用 Int 就够了。
这可以提高代码一致性和可复用性。
即使是在32位平 台上,Int 可以存储的整数范围也可以达到 -2,147,483,648 ~ 2,147,483,647 ,大多数时候这已经足够大 了。

注释
整数,浮点数

类型安全和类型推断

Swift 是一个类型安全(type safe)的语言。类型安全的语言可以让你清楚地知道代码要处理的值的类型。如果
你的代码需要一个 String ,你绝对不可能不小心传进去一个 Int 。

由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记 为错误。
这可以让你在开发的时候尽早发现并修复错误。
布尔值
Swift 有一个基本的布尔(Boolean)类型,叫做 Bool 。
布尔值指逻辑上的值,因为它们只能是真或者假。
Swift 有两个布尔常量,true 和 false.

当你编写条件语句比如   语句的时候,布尔值非常有用:
if turnipsAreDelicious {
     print("Mmm, tasty turnips!")
 } else {
     print("Eww, turnips are horrible.")
}
// 输出 "Eww, turnips are horrible."

但是在配合if语句的时候,判断结果必须为bool值,否则会报错,这点比oc的语法严谨了很多。

元组

元组(tuples)把多个值组合成一个复合值。
元组内的值可以是任意类型,并不要求是相同类型。
你可以把任意顺序的类型组合成一个元组,这个元组可以包含所有类型。只要你想,你可以创建一个类型为或者其他任何你想要的组合的元组。
(常用于异常处理,组合显示,可自定义参数名)
元祖的使用在临时组织值时是比oc便利的。

let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)")
// 输出 "The status code is 200"
print("The status message is \(http200Status.description)") // 输出 "The status message is OK"

可选类型

使用可选类型(optionals)来处理值可能缺失的情况.
可选类型表示:有值,等于 x或者没有值
类似于Objective-C 中的nil,但是有很大不同,Objective-C 中的nil只针对于对象,Swift 的可选类型可以让 你暗示任意类型的值缺失,并不需要一个特殊值。
在 Swift 中, nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设 置为 nil ,不只是对象类型
使用方法:在类型标注后面添加一个'?'号
如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为 nil :

可选绑定(if let使用)

使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变 量。
可选绑定可以用在 if 和 while 语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将 可选类型中的值赋给一个常量或者变量。
 if let actualNumber = Int(possibleNumber) {
     print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
 } else {
     print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 输出 "'123' has an integer value of 123"
这段代码可以被理解为:
“如果 Int(possibleNumber) 返回的可选 Int 包含一个值,创建一个叫做 actualNumber 的新常量并将可选 包含的值赋给它。”
如果转换成功, actualNumber 常量可以在 if 语句的第一个分支中使用。
它已经被可选类型 包含的 值初始化 过,所以不需要再使用 ! 后缀来获取它的值。在这个例子中,actualNumber 只被用来输出转换结果。
你可以在可选绑定中使用常量和变量。
如果你想在if语句的第一个分支中操作 actualNumber 的值,你可以改 成 if var actualNumber ,这样可选类型包含的值就会被赋给一个变量而非常量。
你可以包含多个可选绑定或多个布尔条件在一个 if 语句中,只要使用逗号分开就行。
只要有任意一个可选绑定 的值为nil,或者任意一个布尔条件为false,则整个if条件判断为false,这时你就需要使用嵌套 if 条 件语句来处理

隐式解析可选类型

可选类型暗示了常量或者变量可以“没有值”。
可选可以通过 if 语句来判断是否有值,如果有值的 话可以通过可选绑定来解析值。
有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解
析可选值是非常低效的,因为可以确定它总会有值。
这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。
把想要用作可选的类型 的后面的问号( String? )改成感叹号( String! )来声明一个隐式解析可选类型。
当可选类型被第一次赋值之后就可以确定之后一直有值的时候,隐式解析可选类型非常有用。
一个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用 解析来获取可选值。
下面的例子展示了可选类型 String 和隐式解析可选类型 String 之间的区别:
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要感叹号来获取值
let assumedString: String! = "An implicitly unwrapped optional string." let implicitString: String = assumedString // 不需要感叹号
你可以把隐式解析可选类型当做一个可以自动解析的可选类型。
你要做的只是声明的时候把感叹号放到类型的结
尾,而不是每次取值的可选名字的结尾。

错误处理

你可以使用 错误处理(error handling) 来应对程序执行中可能会遇到的错误条件。
相对于可选中运用值的存在与缺失来表达函数的成功与失败,错误处理可以推断失败的原因,并传播至程序的其
他部分。
当一个函数遇到错误条件,它能报错。
调用函数的地方能抛出错误消息并合理处理。
func canThrowAnError() throws { // 这个函数有可能抛出错误
}
一个函数可以通过在声明中添加   关键词来抛出错误消息。当你的函数能抛出错误消息时, 你应该在表达式 中前置 关键词。
do {
try canThrowAnError() // 没有错误消息抛出
} catch {
// 有一个错误消息抛出
}
一个 语句创建了一个新的包含作用域,使得错误能被传播到一个或多个从句。

断言

可选类型可以让你判断值是否存在,你可以在代码中优 地处理值缺失的情况。
然而,在某些情况下,如果值缺 失或者值并不满足特定的条件,你的代码可能没办法继续执行。
这时,你可以在你的代码中触发一个 断言(asse rtion) 来结束代码运行并通过调试来找到值缺失的原因
使用断言进行调试
断言会在运行时判断一个逻辑条件是否为 true 。
从字面意思来说,断言“断言”一个条件是否为真。你可以使 用断言来保证在运行其他代码之前,某些重要的条件已经被满足。
如果条件判断为 true ,代码运行会继续进 行;如果条件判断为 false ,代码执行结束,你的应用被终止。
如果你的代码在调试环境下触发了一个断言,比如你在 Xcode 中构建并运行一个应用,你可以清楚地看到不合法 的状态发生在哪里并检查断言被触发时你的应用的状态。
此外,断言允许你附加一条调试信息。
你可以使用全局 assert(_:_:file:line:) 函数来写一个断言。向这个函数传入一个结果为 true 或者 false 的表达式以及一条信息,当表达式的结果为 false 的时候这条信息会被显示:

let age = -3
assert(age >= 0, "A person's age cannot be less than zero") // 因为 age < 0,所以断言会触发
在这个例子中,只有 age >= 0 为 true 的时候,即 age 的值非负的时候,代码才会继续执行。
如果 age 的值是负数,就像代码中那样, age >= 0 为 false ,断言被触发,终止应用。
如果不需要断言信息,可以省略,就像这样: assert(age >= 0)
注意:
当代码使用优化编译的时候,断言将会被禁用,例如在 Xcode 中,使用默认的 target Release 配置选项来 bu ild 时,断言会被禁用
何时使用断言

当条件可能为假时使用断言,但是最终一定要保证条件为真,这样你的代码才能继续运行。断言的适用情景:
• 整数类型的下标索引被传入一个自定义下标实现,但是下标索引值可能太小或者太大。
• 需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。
• 一个可选值现在是 nil ,但是后面的代码运行需要一个非 nil 值。

参考文章:中文版 Apple 官方 Swift 教程《The Swift Programming Language》

相关文章

网友评论

      本文标题:Swift之数据类型

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