一丶基础
1丶常量变量
let
ver
2丶控制流
if while
3丶遍历
for ,for-in ,while, repeat-while
声明属性时类型后加?表示该变量值可选
swift ?? 等同与oc三目元算符号
..<可以标识范围(使用..<不包含上界,如果项包含的需要使用...)
4丶函数
使用func声明一个函数,使用名字参数来调用函数,使用->来指定函数返回值类型
func greet(person: String, day: String) ->String {
return "hello \(persion), today is \(day)."
}
greet (person: "Bob", day:"Tuesday")
注释:参数前可以加参数标签,不想使用参数标签可以是使用_代替
5丶元组
1.使用元组可以返回一个或者多个值
2.多个参数可以使用数组的形式 int...
func sumOf(number: Int...) -> Int {
}
3.函数可以嵌套,就是函数内部包含函数
4.函数可以为一等函数,就是函数可以作为另一个函数的返回值返回值
5.函数可以作为参数,就是当做参数传入另一个函数
6.函数是一种特殊的闭包:它是一段能之后被调用的代码;闭包中的代码能够访问闭包作用域中能得到的变量和函数,即使闭包在一个不同的作用域被执行,使用{}创建闭包,in 将参数与返回值类型与闭包函数提进行分离
number.map({
(number: Int) -> Int in
let result = 3 *number
return result
})
7.简写:如果闭包参数类型与返回值类型已确定,可以忽略
number.map({ number in 3*number})
8.可以通过参数位置来引用参数
let sortedNumbers = number.sort{$0 ? $1}
二丶对象与类
1.基础 class创建一个类 ,注意地方就是它们的上下文是类
2.声明属性方法
3.创建一个类的实例,在类名后加括号
var shape = Shape()
shape.numberOfSildes = 7
var shapeDescription = shape.simpleDescription()
4.构造函数->init 来创建一个构造器
5. 子类继承父类:子类的定义方法是在它们的类名后面加上父类的名字,用冒号:分割
子类重写父类发方法使用override标记,未添加直接重写编译器会报错,编译器会检测 override 标记的方法是否存在于父类
6.除了存储属性,属性还有getter setter (newValue 在setter中标识传入的新值)
7.需要在设置新值之前或者之后运行的代码 可以使用willSet 和didSet
8.可选值:处理变量可选值时,可以在方法丶属性丶子脚本前加?,如果问号之前的值为nil,?后所有东西都会被忽略,反之则会运行
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength
三丶枚举结构体
1.使用enum创建一个枚举,枚举可以包含方法
enum Rank: Int {
case Ace = 1
case Two, Three,
func simpleDescription() - >String {
swift self {
case .Ace:
return "ace"
}
}
}
注意:枚举的成员值为实际值
四丶扩展协议
1.使用protocaol来声明一个协议
protocol ExampleProtolol {
var simpleDescription: String {get}
mutating func adjust()
}
2.类枚举结构体都可以实现协议
五丶错误处理
1.使用Error协议的类型来标识错误
enum PrinterError: Error {
case outOfPaper
case noToner
case onFire
}
2.使用throw来抛出一个错误,并使用throws来表示一个可以抛出错误的函数,如果在函数中抛出一个错误,那么这个函数会立刻返回并调用该函数的代码处理进行错误处理
func send(jod: Int, toPrinter PrinterName: String )throws ->String {
if printerName = "Never Has Toner" {
throw PrinterError.noToner
}
return "Job sent"
}
3.do-catch,在do的代码块中,使用try来抛出错误的代码,在catch的代码块中,除非你另外命名,否则错误会自动命名error
do {
let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")
print(printerResponse)
} catch {
print(error)
}
4.可以使用多个catch 块来处理错误
5.使用try?将函数结果转化为可选,如果函数抛出错误,改错误会被抛弃并且结果为nil,否则的话,结果会是一个包含函数返回值的可选值。
let printerSuccess = try? send(job: 1884, toPrinter :"Mergenthaler")
6.使用defer代码块来表示,在函数返回之前,函数中最后执行的代码,无论函数是否会跑出异常,这段代码都会被执行
六丶泛型
1.在尖括号里写一个名字来创建泛型函数或者类型
2.也可以泛型创建函数丶方法丶类丶枚举结构
enum OptionalValue<Wrapped>{
case None
case Some(Wrapped)
}
var possibleInteger:OPtionalValue<Int> = .None
possibleInterger = .Some(100)
----------------------- 如果不是生活所迫,谁会想这样默默承受,有些人,过的比你难得多 -------------------------