OC和swift混编注意点:
1.新建一个swift文件时,会提示你是否建立桥接文件,系统会建立“工程名-Bridging-Header.h”
2.配置工程Build Settings 设置Defines Mod?ule 为Yes,设置Product Module Name 为当前工程名
3.swift引用OC文件,需要在“工程名-Bridging-Header.h”桥接文件中导入OC头文件
4.OC引用swift文件,在OC文件中导入#import "工程名-Swift.h",注意swift文件的方法名前面要加@objc,不然方法调用不了
Person * person = [Person new];[person askNameWithName:@""];@objcMembers class Person:NSObject{var oName:String?var age:String?@objc func askName(name:String){popView.show()}lazy var popView:YISignCodePopView = {let popView = YISignCodePopView()return popView;}()}
array
flatMap: 对数组的每一个元素做一次处理,返回处理后的数组。
与map的区别是:
1.返回后的数组中不存在nil, 同时也会把Optional解包。
2.flatMap还能把多维数组变成一维数组。
compactMap与flatMap的区别上面也说了,当闭包中的返回结果是可选的时候,使用compactMap代替flatMap
as、as!、as?
as
1.从派生类转换为基类,向上转型(upcasts) 子类赋值给父类 let person1 = tom as Person
2.消除二义性,数值类型转换 消除整型还是浮点
3.switch语法检测对象的类型 case let person1 as Student:
as!
向下转型(Downcasting)时使用 父类赋值给子类
as? as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。
swift self 使用
1.参数名和自身的属性名同名,消除访问属性,调用方法时所产生的歧义
class AClass {
var greeting: String
init(greeting: String) {
// 使用self区分属性和参数
self.greeting = greeting
}
}
2.在便利构造函数中调用自身的指定构造函数时
convenience init() {
/*必须使用self,因为按照二段构造的规则,在第一阶段初始化完成之前,无法使用self,
而且由于面向对象语言的特性,所有的初始化方法名都是init,没有self,系统不知道调用谁的init */
self.init()
}
3.闭包中访问自身属性和调用自身方法时
UIView.animateWithDuration(0.25) { () -> Void in
/*闭包可能被抛出,其必须知道其中的方法和属性属于谁,所以要用self*/
self.layoutIfNeeded()
}
4.被mutating修饰的值类型方法中,修改self属性时
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
函数省略规则
1.将作为参数的函数变成无名函数
变化规则: 及闭包
a. 省略函数名 保留花括号 {}
b. 把参数列表和返回参数 (即函数类型) 写在{}第一行
c. 用 in 将 函数类型 与 函数体 区分开来
2.省略返回类型, 当编译器已知该函数返回类型的时候
3.省略参数列表和in, 当没有参数的时候
4.省略参数类型和参数列表括号,当编译器已知参数类型的时候
5.省略 函数类型和in ,并使用$0,$1等访问参数,当编译器已知参数类型的时候
6.省略 函数类型和in ,不访问函数参数
规则: 使用下划线 _ 代替整个参数列表
7.当且仅当无名函数作为caller函数的最后一个参数的时候,
可以省略最后一个参数名称(即把caller函数结束标志的 ")" 放在倒数第二个参数的末尾)
将此无名函数紧跟在 ")" 后面,作为最后一个参数
private 表示代码只能在当前作用域或者同一文件中同一类型的作用域中被使用,
fileprivate 表示代码可以在当前文件中被访问,而不做类型限定。
你可以在遵循协议的类中实现构造器,无论是作为指定构造器,还是作为便利构造器。无论哪种情况,你都必须为构造器实现标上 required
mutating
如果你在协议中定义了一个实例方法,该方法会改变遵循该协议的类型的实例,那么在定义协议时需要在方法前加 mutating 关键字。这使得结构体和枚举能够遵循此协议并满足此方法要求