Swift不强制你在每条语句之后添加 ;
, 有种情况必须
添加 , 你打算在同一行内写多条独立的语句
let cat = ""; print(cat)
Swift 是一个*类型安全(type safe)*的语言。类型安全的语言可以让你清楚地知道代码要处理的值的类型。如果你的代码需要一个 String
,你绝对不可能不小心传进去一个 Int
, 在编译器检查阶段就会爆出错误.
一般情况下Swift都要求你给一个属性赋值一个初始值, 这样的话通过检查你赋的值, Swift 会使用*类型推断(type inference)*来选择合适的类型, 所以并不是说你每次声明常量和变量的时候都需要显式指定类型
let myName = "summerxx"
// myName 会被推测为 String 类型
*类型别名(type aliases)*就是给现有类型定义另一个名字。Swift中你可以使用 typealias
关键字来定义类型别名。
// Swift
typealias AudioSample = UInt16
// ObjC
typedef <#type#> <#name#>;
*元组(tuples)*把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。
let http404Error = (404, "Not Found")
// http404Error 的类型是 (Int, String),值是 (404, "Not Found")
// statusCode=404 statusMessage= "Not Found"
元组访问 Example Code
print("The status code is \(http404Error.0)")
// 输出“The status code is 404”
print("The status message is \(http404Error.1)")
// 输出“The status message is Not Found”
元组详细可以看这里
使用*可选类型(optionals)*来处理值可能缺失的情况。可选类型表示两种可能: 或者有值, 你可以解析可选类型访问这个值, 或者根本没有值。
Swift 的 Int
类型有一种构造器,作用是将一个 String
值转换成一个 Int
值。然而,并不是所有的字符串都可以转换成一个整数。字符串 "123"
可以被转换成数字 123
,但是字符串 "hello, summerxx"
不行;
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
Swift: nil
不能用于非可选的常量和变量, 只能用于可选值, 是一个确定的值, 表示值缺失, 任何类型的可选状态都可以被设置为 nil
,不只是对象类型。
ObjC: nil
是一个指向不存在对象的指针, 用于对象
var surveyAnswer: String?
// surveyAnswer 被自动设置为 nil
你可以使用 if
语句和 nil
比较来判断一个可选值是否包含值。你可以使用“相等”(==
)或“不等”(!=
)来执行比较。
// 其中 convertedNumber 必须为可选值
if convertedNumber != nil {
print("convertedNumber contains some integer value.")
}
!
当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!
)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它
if convertedNumber != nil {
// convertedNumber!
print("convertedNumber has an integer value of \(convertedNumber!).")
}
使用*可选绑定(optional binding)*来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量
if let constantName = someOptional {
statements
}
你可以包含多个可选绑定或多个布尔条件在一个 if
语句中,只要使用逗号分开就行。
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
// 输出“4 < 42 < 100”
if let firstNumber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
}
}
// 输出“4 < 42 < 100”
第一次被赋值之后,可以确定一个可选类型总会有值
想要用作可选的类型的后面的问号(String?
)改成感叹号(String!
)来声明一个隐式解析可选类型
常用场景 , 隐式解析可选类型主要被用在 Swift 中类的构造过程中
展示可选类型 String
和隐式解析可选类型 String
之间的区别的示例Code
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要感叹号来获取值
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 不需要感叹号
在此例中,makeASandwich()
(做一个三明治)函数会抛出一个错误消息如果没有干净的盘子或者某个原料缺失。因为 makeASandwich()
抛出错误,函数调用被包裹在 try
表达式中。将函数包裹在一个 do
语句中,任何被抛出的错误会被传播到提供的 catch
从句中。
如果没有错误被抛出,eatASandwich()
函数会被调用。如果一个匹配 SandwichError.outOfCleanDishes
的错误被抛出,washDishes()
函数会被调用。如果一个匹配 SandwichError.missingIngredients
的错误被抛出,buyGroceries(_:)
函数会被调用,并且使用 catch
所捕捉到的关联值 [String]
作为参数。
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients)
}
你可以调用 Swift 标准库的 assert(_:_:file:line:)
函数来写一个断言。向这个函数传入一个结果为 true
或者 false
的表达式以及一条信息,当表达式的结果为 false
的时候这条信息会被显示:
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// 因为 age < 0,所以断言会触发
/*
Assertion failed: A person's age cannot be less than zero: file /Users/summerxx/Documents/GitHub/SwiftGuide/SwiftJavaScriptCore/SwiftJavaScriptCore/SwiftJavaScriptCore/MyViewController.swift, line 21
2020-07-28 15:10:08.277087+0800 SwiftJavaScriptCore[79723:6721563] Assertion failed: A person's age cannot be less than zero: file /Users/summerxx/Documents/GitHub/SwiftGuide/SwiftJavaScriptCore/SwiftJavaScriptCore/SwiftJavaScriptCore/MyViewController.swift, line 21
*/
如果使用代码做了校验还可以直接调用
if age > 10 {
print("You can ride the roller-coaster or the ferris wheel.")
} else if age > 0 {
print("You can ride the ferris wheel.")
} else {
assertionFailure("A person's age can't be less than zero.")
}
=
)不再有返回值===
与!==
)因为类是引用类型,所以多个常量和变量可能在幕后同时引用同一个类实例, 横的呢过运算符在判定两个常量或者变量是否引用同一个类实例有时很有用 示例代码
备注: 恒等运算符表示两个类类型(class type)的常量或者变量是否引用同一个类实例
if tenEighty === alsoTenEighty {
print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
??
空合运算符(a ?? b
)将对可选类型 a
进行空判断,如果 a
包含一个值就进行解包,否则就返回一个默认值 b
。表达式 a
必须是 Optional 类型。默认值 b
的类型必须要和 a
存储值的类型保持一致。
"""
"""
字符串字面量可以包含以下特殊字符:转义字符 \0
(空字符)、\\
(反斜线)、\t
(水平制表符)、\n
(换行符)、\r
(回车符)、\"
(双引号)、\'
(单引号)。
Unicode 标量,写成 \u{n}
(u 为小写),其中 n
为任意一到八位十六进制数且可用的 Unicode 位码。
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imageination is more important than knowledge" - Enistein
let dollarSign = "\u{24}" // $,Unicode 标量 U+0024
let blackHeart = "\u{2665}" // ♥,Unicode 标量 U+2665
let sparklingHeart = "\u{1F496}" // ,Unicode 标量 U+1F496
如果你创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。在前述任一情况下,都会对已有字符串值创建新副本
Swift 默认拷贝字符串的行为保证了在函数/方法向你传递的字符串所属权属于你,无论该值来自于哪里。你可以确信传递的字符串不会被修改
字符串可以通过加法运算符(+
)相加在一起(或称“连接”)创建一个新的字符串
你也可以通过加法赋值运算符(+=
)将一个字符串添加到一个已经存在字符串变量上
你也可以用 append()
方法将一个字符附加到一个字符串变量的尾部
Unicode是一个用于在不同书写系统中对文本进行编码、表示和处理的国际标准
Swift 的 String
类型是基于 Unicode 标量 建立的。Unicode 标量是对应字符或者修饰符的唯一的 21 位数字,例如 U+0061
表示小写的拉丁字母(LATIN SMALL LETTER A
)("a
"),U+1F425
表示小鸡表情(FRONT-FACING BABY CHICK
)("
")。
请注意,并非所有 21 位 Unicode 标量值都分配给字符,某些标量被保留用于将来分配或用于 UTF-16 编码。已分配的标量值通常也有一个名称,例如上面示例中的 LATIN SMALL LETTER A 和 FRONT-FACING BABY CHICK。