本文对Swift做一个从OC的角度的基础知识简单概要。
Swift | OC | 说明 |
let、var | const | 在OC中不用const声明的常量,都认为是变量 |
Float、Double | CGFloat | |
Int | NSInteger | |
String | NSString | |
Bool | BOOL | OC中的非1为flase,1为ture在Swift中不适用 |
Array | NSArray | |
Dictionary | NSDictionary | |
Set | NSSet | |
Tuple | - | |
Optional | - | |
nil | nil | Swift中的nil和OC中的含义不一样 |
if语句 | if语句 | if语句的语法写作不一样,尤其是Swift中if嵌套简写 |
try..throw | - | OC中没有采用抛异常处理机制 |
assert | NSAssert |
以下的概念,先要有个印象:
1、声明常量用let、声明变量用var
·常量的值一旦设定就不能改变,而变量的值可以随意更改
let a = 10
var b = "hello, world!"
2、类型标注
·通过上面的例子可以看出,声明常量和变量的时候,可以不标注常量或者变量的类型,这是因为Swift的「类型安全和类型推断」功能,可以通过声明常量或者变量的时候赋的初始值推断出这个常量或者变量的类型。
·如果没有赋初始值又想表明该常量或者变量的类型,就的用“: 类型名”的方式标注类型
var welcomMessage : String
3、常量和变量的命名
·命名方面跟OC一样
4、输出常量和变量
·OC语言上使用的是NSLog,Swift使用print(_:separator:terminator:)函数
print(welcomeMessage)
·这个输出函数默认结尾换行,如果不想换行,将空字符串作为terminator的参数传入即可
print(welcomeMessage, terminator:"")
·输出时的拼接采用将常量或者变量放入圆括号中,并在做括号前使用反斜杠将其转义的方式
print("Please speak \(welcomeMessage)")
5、注释
·采用跟OC一样的方式
6、分号
·与OC不一样,Swift不强制使用分号
·如果打算在同一行内写多条独立的语句,那就要使用分号
7、整数与浮点数
·OC使用的NSInteger,Swift使用Int
·OC使用的NSUInteger,Swift使用UInt
·OC使用的CGFloat,Swift使用Double(64位浮点数)、Float(32位浮点数)
8、类型安全和类型推断
·进行类型检查是在编译时期
·浮点型推断成Double而不是Float
·类型安全到Int数值无法跟Double数值直接相加的地步,此时需要使用「数值型类型转换」
9、数值型字面量
·整数字面量:十进制、二进制、八进制、十六进制
·浮点字面量:十进制、十六进制
10、数值型类型转换
·数值型一般使用Int
·Int8和Int16之间不能直接进行计算,需要采用Int16(Int8的数值)进行转换
·整数和浮点数不能直接进行计算,需要采用类似于Double(Int的数值)进行转换
11、类型别名,使用typealias关键字
typealias AudioSample = UInt16
12、布尔值
·Swift采用的是Bool(包括ture和false)
·与OC中的BOOL不一样的是,OC中1代表ture,非1代表false。但是在Swift中的类型安全机制下1不能代表ture
let i = 1
if i {
//这个例子不会通过编译,会报错
}
13、元组tuples
·元组是在Swift语言中出现的一种数据类型,在OC中并没有
·元组的出现,尤其在函数返回值时,元组非常有用。在OC中没有元组的概念,一般需要使用数组或者字典或者自定义类型来达到同样的目的
let http404Error = (404, "Not Found")
// http404Error的类型是(Int, String),值是(404, "Not Found")
let (statusCode, statusMessage) = heet404Error
print("The status code is \(statusCode)")
// 可以将以一个元组的内容分解成单独的常量和变量,然后就可以正常的使用它们了
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 如果只需要一部分元组值,分解的时候可以把要忽略的部分用下划线( _)标记
print("The status code is \(http404Error.0)")
// 可以通过下标来访问元组中的单个元素,下标从0开始
let http200Status = (statusCode:200, description: "OK")
print("The status code is \(http200Status.statusCode)")
// 在定义元组的时候可以给单个元素命名后,通过名字来获取这些元素的值
14、可选类型optionals
·可选类型在OC中没有出现过,在OC中与可选类型最接近的一个概念就是nil。在OC中nil表示“缺少一个合法的对象”,但是nil表示的是对象。对于结构体、基本的C类型或者枚举类型,OC一般使用比如NSNotFound来暗示值的缺失。
·但是在Swift中的nil与OC中的概念是不一样的,在OC中nil指向不存在对象的指针,在Swfit中nil不是指针,他是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。并且在Swift中nil不能用于非可选类型的常量和变量。如果代码中有常量或者变量需要处理值缺失的情况,那么将它们声明成对应的可选类型。
·可选类型可以做作类型表明也可以作为类型推断出的类型,比如下面的代码
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// 并不是所有的String类型都能够转换成Int型,如果转换不成功的时候返回的就是nil。所以这种情境下,SwiftUI推测convertedNumber的类型是Int?
var serverResponseCode: Int? = 400
// serverResponseCode包含一个可选的Int值404
serverResponseCode = nil
// serverResponseCode现在不包含值
var surveyAnswer: String?
// 如果在声明一个可选常量或者变量的时候没有赋值,它们会自动被设置为nil
15、nil在if语句中的使用及强制解析
·使用相等(==)或者不等(!=)来判断一个可选值是否包含值。
·如果确定一个可选类型包含值,可以使用在可选的名字后面加一个感叹号(!)来获取值。
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).")
}
16、可选绑定
·可选绑定可以用在if和while语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。
·关于在if语句中完成可选绑定在代码上并不复杂,但是if语句和OC的不一样需要注意下
if let actualNumber = Int(possibleNumber) {
var accountNumber = actualNumber + 12
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 这里需要注意的是,其一actualNumber只用在后面的可选类型有值的情况下才创建并赋值,如果不存在,actualNumber常量不会被创建;其二,actualNumber只是临时常量,只有在if的body分支中可以使用。
·另外就是if的嵌套使用在Swift语法中需要的代码更加简洁,下面两种代码表述是一样的:
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
if let firstNmuber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber && sectondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
}
}
17、隐式解析可选类型
·有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次又要判断和解析可选值是非常低效的,因为可以确定它总会有值。这种类型的可选状态被定义为隐式解析可选类型。如果在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和在没有值的普通可选类型后面加一个感叹号一样。因此,仍然可以把隐式解析可选类型当作普通可选类型来判断它是否包含值。
let possibleString: String? = "An optional string."
let forcesString: String = posssibleString!//需要感叹号来获取值
let assumedString: String! = "An implicitly unmrapped optional string."
let implicitString: String = assumedString//不需要感叹号
if assumedString != nil {
print(assumedString)
}
18、错误处理
·OC中并没有使用try...throws...catch...的抛出异常处理的机制,Swift这次把它加进来了
func makeAsandwich() throws {
//...
}
do {
tyr makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients)
}
19、断言
·在OC中也是有断言(使用的是NSAssert),Swift中使用assert
·当条件可能为假时使用断言,但是最终一定要保证条件为真,这样你的代码才能继续运行。断言的适用情景:
·整数类型的下标索引被传入一个自定义下标实现,但是下标索引值kennel太小或者太大
·需要给函数传入一个值,但是非法的值可能导致函数不能正常执行
·一个可选值现在是nil,但是后面的代码运行需要一个非nil值