1.swift Protocol
-
设置可选协议方法
-
需要遵守
NSObjectProtocol
协议 -
协议需要是
@objec
-
方法是需要@object optional
@objc protocol CircleDelegate:NSObjectProtocol { @objc optional func cirelcPrint() } 复制代码
-
定义delegate 属性
weak var delegate:CircleDelegate?
-
调用代理方法
delegate?.cirelcPrint?()
-
-
protocol
mutating
关键字-
使用mutation 关键字来标记一个会修改结构体的刚发
-
class 中不需要使用mutating标记,因为类总方法通常可以修改类属性
-
可以给系统方法增加写extion,遵守代理
-
2.switchCase
-
case let x where x.hasSuffix("peper"): print("li it a spicy")
-
可以在case中使用where 进行判断
3.元组
-
取元组可以根据属性,也可以根据下标取
let amutule : (min:Int,max:Int,sum:Int) = (2,4,6) print(amutule.sum) print(amutule.2) 复制代码
4.函数的不确定参数个数
-
传入一个不确定参数类别,计算和
func sumOfnumbers(numbers:Int...)->Int{ var sum = 0 for numbe in numbers { sum += numbe } return sum } print("\(sumOfnumbers(numbers: 2,3,4,5,5))") 复制代码
5.函数作为一个参数,传入另一个函数中
-
一个函数传入一个参数,一个判断条件的函数参数,返回值是bool
-
在函数内部,传参数1,调用函数参数判断
6.函数作为返回值
-
函数作为返回值
-
适用的时候,生产函数类型的变量,调用变量(函数)方法
7.集合map
的使用
-
使用map 批量操作集合内的元素
-
匹配符合集合的元素批量处理,也可以进行判断,不符合条件的为0
-
如果一个闭包的类型已知,并且作为回调函数,可以忽略参数类型和返回值,单个闭包语句,会把它语句的值当作返回值返回
-
可以通过参数所在的位置,替代参数名来引用参数,在非常短的闭包中非常有用
8.setter 和getter
方法
-
在setter 中新值是newValue
-
可以在set 后面显示设置一个别名
9.监测API 可用性
- 监测API 可用性 iOS 10
func textAPI(){ if #available(iOS 10, macOS 10.12,*) { // 在iOS 10使用,MacOS 10。12使用 }else{ // 使用先前的iOS,macOS的API } } 复制代码
10.swift 数组
-
数组的CRUD
var aArray = Array(repeating: 0.4, count: 3); //aArray.isEmpty //aArray.append(<#T##newElement: Double##Double#>) //aArray.insert(<#T##newElement: Double##Double#>, at: <#T##Int#>) //aArray.remove(at: <#T##Int#>) //aArray.removeLast() for (indx,value) in aArray.enumerated() { print("\(indx)----\(value)") } 复制代码
11.swift字符串
-
字符串的CRUD
func textString(){ var astring = "Guten Tag!" if astring.isEmpty { // 空字符串 } print("\(astring[astring.startIndex])") // G print("\(astring[astring.index(before: astring.endIndex)])") // ! print("\(astring[astring.index(after: astring.startIndex)])") // u // let aindex = astring.index(astring.startIndex, offsetBy: 7); // print("\(astring[aindex])") // a astring.insert("!", at: astring.endIndex) astring.insert(contentsOf: "there".characters, at: astring.index(before: astring.endIndex)) // 前缀 - 后缀 _ = astring.hasPrefix("acutnr") _ = astring.hasSuffix("!") } 复制代码
12.范型
-
实用方法:
-
在尖括号里面写一个名族创建一个范型函数或者类型
-
定一个函数,传入一个未知类型参数,重复N词,返回数组,数组红元素类型就是传入的类型
-
-
使用范型- 重新实现可选类型
-
定义可选类型的枚举
-
使用赋值
-
-
实现方法,限定参数遵守协议,类型是相同的
-
比较两个数组中相同的元素,有返回true,没有返回false
-
可以计算 两个集合中相同的元素返回
-
在类型名之后使用where 制定类型的需求
-
比如,限定类型实现某一个协议,限定两个类型是相同的,或者限定某个类必须有一个特定的父类”
-
where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element
func anyCommonElements<T:Sequence,U:Sequence>(_ lhs :T,_ rhs: U)->Bool where T.Iterator.Element:Equatable,T.Iterator.Element == U.Iterator.Element{ for lhsElement in lhs { for rhsElement in rhs { if lhsElement == rhsElement { return true } } } return false } 复制代码
-
13.集合操作
-
a.intersection(b)
A和B集合的交集 (A&B) -
a.symmtriDifference(b)
A +B - (A&B) -
a.union(b)
A+B -
a.subtracting(b)
A-(A&B)
14.递归枚举
-
在枚举成员前面,加上 indirect 关键字,是可以递归的
enum ArithmeticExpression { case number(Int) indirect case addition(ArithmeticExpression,ArithmeticExpression) indirect case multiplication(ArithmeticExpression,ArithmeticExpression) } 复制代码
-
调用枚举
let five = ArithmeticExpression.number(5) let foure = ArithmeticExpression.number(4) let sum = ArithmeticExpression.addition(five, foure) let procuct = ArithmeticExpression.multiplication(sum, .number(2)) 复制代码
-
操作能可以递归的枚举,需要可以递归的函数,
-
如果是纯数字,直接返回该值,如果是加法,或者乘法,计算左右的算法的值,然后相加,乘
func evaluate(_ expression:ArithmeticExpression) -> Int{ switch expression { case let .number(value): return value case let .addition(left, right): return evaluate(left) + evaluate(right) case let .multiplication(left, right): return evaluate(left) * evaluate(right) } } 复制代码
15.Swift 下标 subscript
-
写法:
-
定义下标使用
subscript
关键字,指定一个或多个输入参数和返回类型 -
与实例方法不同的是,下标可以设定为读写或只读
subscript (index:Int)->Int{ get{ //返回一个适当的int 类型的操作 return 0 } set(newValue){ // 执行适当的赋值操作 } } 复制代码
-
下标可以接受任意数量的入参,并且这些入参可以是任意类型。下标的返回值也可以是任意类型。下标可以使用变量参数和可变参数,但不能使用输入输出参数,也不能给参数设置默认值
-
定义了一个Matrix结构体,用于表示一个Double类型的二维矩阵
struct Matrix { let rows: Int, columns: Int var grid: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns grid = Array(repeating: 0.0,count: rows * columns) } func indexIsValidForRow(row: Int, column: Int) -> Bool { return row >= 0 && row < rows && column >= 0 && column < columns } // N 行 * N 列的矩阵 subscript(row: Int, column: Int) -> Double { get { assert(indexIsValidForRow(row: row, column: column), "Index out of range") return grid[(row * columns) + column] } set { assert(indexIsValidForRow(row: row, column: column), "Index out of range") grid[(row * columns) + column] = newValue } } } 复制代码
-
使用
16.swift析构过程
- 析构器用
deinit
表示 -- 构造器init - deinit {}
17.swift访问控制
-
模块和源文件
- 使用
import
导入另外一个模块
- 使用
-
访问级别 五种不同的访问级别
-
开放访问/公开访问 -----同一模块下的任意文件,任意方法,任意实体
-
内部访问 ----在模块内访问任何实体,到那时不能从外部导入模块访问
-
文件私有访问 只能在定义的文件内部访问
-
私有访问限制 只能在定义的作用域内访问
-
-
开放访问权限最高,私有访问最低访问级别
-
开放访问只作用于类类型和类的成员,和公开访问区别如下
-
开放访问的类,可以在模块内,模块外继承,公开访问和更严的访问级别的类,只能在他们定义的模块内部被继承
-
开放访问的类成员,可以在模块内,模块外的子类重写,公开访问只能在定义的模版内部重写。
-
默认访问级别
interal
级别 -
单目标程序,是为整个程序服务的,默认interal 即可。
-
访问控制语法
-
通过
open
,public
,internal
,filepart
,private
, 修饰符,声明实体的访问级别:
-
-
子类的访问级别不得高于父类的访问级别
-
函数的访问级别
18.Pch 文件创建
- 工程 - >TARGETS -> Bulid Settings ->搜索prefix -> LLVM -Language 下的
Precompile Prefix Header
设置置为YES,默认是NO。 - LLVM -Language 设置下,
Prefix Header
pch文件路径