Swift拥有所有基本C和Objective-C类型
Int整型
Double & Float浮点型
Bool布尔值
String文本数据
Swift还拥有三种集合主要类型: Array, Set & Dictionary
Swift引入了Optional<T>(可选类型) .
在编程中不可避免的,函数不总是返回我们期望的值.
Objective-C中我们可以使用类似哨兵值的方法解决(然而也并不能完全解决)
例如
NSString * tmp = nil;
if ([tmp rangeOfString: @"Swift"].location != NSNotFound) {
NSLog(@"Something about Swift");//Will execution the code and print.
}
在Objective-C中执行这段代码,将会在控制台得到 Something about
而在Swift中,则使用Optional替代了哨兵值的方法.
它让编辑器会强制我们处理可能发生错误的情况.可以通过包含两个case的enum模拟它得知:
case some(T)表示成功的情况
case none表示失败的情况
例如:
let array = [1, 2]
let index = array.first(它返回的其实是一个Optional<Int>)
如果我们要使用index,则只能用下面的方法:
switch index {
case let .some(index):
print("First value of array is \(index)")
case .none:
print("Not Value")
}
Swift对Switch中使用Optional的时候还有简化版:
switch index {
case let index?:
print("First value of array is \(index)")
case nil:
print("Not Value")
}
(在Swift中的nil与Objective-C中的nil并不一样,在Objective-C中,nil是指向不存在对象的指针.而在Swift中, nil不是指针,而是缺少某种类型的值,我们可以将任何类型的Optional赋值为nil,而不仅是对象类型)
当然以上只是Optional的实现细节,对于我们的使用并不用如此麻烦
我们在使用Optional时,有诸多简化的写法
例如最简单的:
let name: String? = "programmer🐒"
如果我们要使用它的值.可以通过最暴力的办法,即通过(!)强行读取Optional的值,在Swift中叫做force unwrapping:
print(name!)
我们已经见过很多相关的讨论,例如
"永远不要使用force unwrapping"
"除非不得已,才使用它"
:
在绝对安全的情况下使用force unwrapping
if name != nil {
print(name!)
}
or
let numbers: [Int?] = [1, nil, 3]
numbers
.filter { $0 != nil }
.map { print($0!) }
通过unwrapped使用Optional
在条件分支中使用 (if let)
if let name = name {
print(name)
}
更复杂的用法
var image: UIImage?
//something..
if let image = image,
let imageData = image. jpegData(compressionQuality: 0.9),
imageData.count <= (10 * 1024 * 1024) {
//upload data...
}
or 在循环中使用 (while let)
let cars = ["Lincoln", "Lamborghini", "Audi"]
var carIterator = cars.makeIterator() // 不能使用let,否则会在编译时报错
while let carName = cars.next() {
print(carName)
}
(然而在这里也有个知识点.
在Swift中, for…in 是通过while模拟出来的,
for循环中的循环变量在每次迭代时,
都是一个全新的对象,
而不是对上一个循环遍历的修改,
为什么要这样做,
因为在JavaScript中有一种有违直觉的BUG…具体等以后开坑再放链接..)
or 通过guard替代if let,使作用域扩大
func getName() -> String? {
let name: String? = "programmer🐒"
guard let name = name else {
return nil
}
return name
}
还有一种特殊的Optional: 隐式展开的可选值(Implicitly Unwrapped Optional)
它主要在以下两个场景中使用:
1.传承Objective-C中对象指针的语义
2.用来定义初始为nil,但在经过既定流程后,再也不为nil的变量
例如
func ChooseTransportation(_ ownedMoney: Double) {
let transportation: String!
if (ownedMoney > 100 * 10000) {
transportation = "🚗"
} else {
transportation = "🚲"
}
//upload transportation name
}
总得来说,建议还是使用其他办法,来避免直接使用(!)去读取Optional的值
Swift常量变量
Swift使用let声明常量,var声明变量.
且它们必须在使用前声明值,命名规则几乎可以包含任何字符(但不能以数字开头!!,不能包含空格字符,数字符号,箭头和专用的字符)
打印常量或变量:
print(name) | print("The current Value of name is \(name) ")
Swift类型注释
声明常量or变量时,可以提供类型注释,来明确存储值类型.
写法:
var name: String = "programmer🐒"
声明类型的同时必须指定初始值或者给与设为可选类型( Optional<String>? | String? or '!' ),不然编译器会产生错误提示:
"Property 'self.name' not initialized at super.init call"
Swift注释
单行注释:
// a comment.
多行注释:
/*
a comment.
but is written over multiple lines.
*/
多行嵌套注释:(与C不同)
/* start.
/* nested multiline comment. */
end. */
Swift分号;
在Swift中我们并不需要用到分号(;),当然我们可以按喜好添加
不过在一行中包含多个单独代码语句,则需要分号:
let name = "programmer🐒"; print(name)
Swift类型安全性和推断
Swift是类型安全的语言,它会在编译代码时执行类型检查,并产生错误信息.例如无法将Int值传递给String变量.
Swift的类型推断,与Objective-C or C之类的语言相比, 所需的类型声明要少得多.
let carPrice = 199999.99 //Swift会推断出这是创建了一个Double(推断浮点型时,它总会选择Double而不是Float)
Swift布尔值
Swift的布尔类型Bool,亦被称为逻辑值.它只能是true或false,所以并不能像Objective-C一样, 使用
if 1 { /* something.. */ } // 这样做会造成编译时错误.
Swift元组
Swift的元组是在Obective-C中找不到的高级类型之一,它可以创建和传递值分组,
元组将多个值合并为一个复合值,且其中的值可以是任何类型,不必彼此相同.
它适用于一组简单的值,如果需要复杂的数据结构,建议使用Class or Struct
例如:
(Int, Int, Int) | (String, Double, Bool)
写法:
let result = (404, "Not Found")
//result is of type (Int, String)
还可以将其分解为单独的常量或变量,然后直接访问他们
let (statusCode, statusMessage) = result
print("statusCode is \(statusCode) and statusMessage is \(statusMessage)")
或使用下划线( _ )忽略某个不需要用到的值
let (statusCode, _) = result
或直接在初始化时命名
let result = (statusCode: 404, statusMessage: "Not Found")
print("statusCode is \(result.statusCode) and statusMessage is \(result.statusMessage)")
或取消命名直接通过(.)使用
print("statusCode is \(result.0) and statusMessage is \(result.1)")
备注:
以上资料仅仅是通过查阅官方文档 & 泊学网学习并手动记录之,以增强记忆