作者丨wangcj123
来源:
https://juejin.im/post/5e6d9e9d51882549236f95cb
!?
?表示可选类型,如果申明属性或变量的话就是默认值为nil的意思,
!表示解包,对加!的在使用 前一定要做判nil处理,一般用if let 和 guard let来判断,或者用 if a != nil 来做判断
闭包的使用
闭包的表达式:
{(参数)-> 返回值 in
//代码
}
使用例子
申明为变量:
typealias Swiftblock = (String,Any) -> Void
var testBlock: Swiftblock?
使用:
if (testBlock != nil) {
testBlock!("ddd","ffffff")
}
实现:
{ [weak self] (a,b) in
print(a)
print(b)
}
[weak self]是为了防止循环引用,(a,b)是传过来的参数
逃逸闭包:
就是闭包作为函数的参数,但是在函数结束以后才去执行这个参数的就叫逃逸闭包,在参数类型前加@escaping
逃逸闭包的使用例子
private func requestData(success:@escaping (Any) -> Void) {
DispatchQueue.global().async {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
success("data") //3秒后才执行闭包success
})
}
在这个例子中闭包success作为参数,但是他在函数执行完以后过了一段时间才执行,所以他就是逃逸闭包
Any 和AnyObject 类型的 付值时一定要用 as! 做类型匹配
例子:
requestData { (data) in
let str: String = data as! String //因为data是Any类型的付值给String类型的就需要做类型匹配
print(str)
}
func requestData(success:@escaping (Any) -> Void) {
success("data")
}
上面例子中因为参数data是Any类型的付值给String类型的时候就需要做类型匹配
申明函数参数或返回值的时候加?,否则传参数或返回返回值的时候对于可选类型的值要加!
写代理模式的时候
protocol CCDelegate : class { func doSomething() }
记得在后面加上class关键字,一般加class ,
代理当作变量的时候用weak 修饰防止循环引用
weak var delegate: CCDelegate?
if let 和 guard let 的用法,一般用来做非空判断
var some: String? if some != nil{ print(some!) } //或者 guard some != nil else{ return } print(some!) //上面的判断用 if let 和guard let 如下 if let aSome = some{ print(aSome) } guard let aSome = some else { return } print(aSome)
7.swift单例的使用
单例的一般书写格式
class SingleTest {
static let shared = SingleTest()
private init() {} //一定要加private防止外部通过init直接创建实例
}
单例的使用例子:
单例类
class SingleTest {
var aValue: NSString?
var bValue: NSString?
static let shared = SingleTest()
private init() {} //一定要加private防止外部通过init直接创建实例
}
单例的使用
SingleTest.shared.aValue = "aaa"
SingleTest.shared.bValue = "bbb"
print("SingleTest.shared.aValue =\(SingleTest.shared.aValue ?? "kong")")
//输出结果为:SingleTest.shared.aValue =aaa
一些基础的总结,有不对的地方还请留言指正
近期精彩内容推荐:
在看点这里好文分享给更多人↓↓