Tips
// 如何增加一个方法必须实现的提示
class Ordered {
func precedes(other: Ordered) -> Bool { fatalError("implement me!") }
}
// 如何动态加载一个 Class
let aClass: AnyClass? = NSClassFromString("mihaibao.RootTabBarController")
if (aClass != nil) {
let clsName = NSStringFromClass(aClass!)
print(clsName)
} else {
print("error ViewController not found")
}
// 如何打印更多的信息
po response as! HTTPURLResponse
// 解决循环引用
/********** i.e Case 1 ***********/
class A {
let b: B
init() {
b = B()
b.a = self
}
deinit {
print("A deinit")
}
}
class B {
var a: A? = nil
deinit {
print("B deinit")
}
}
// 解决
class B {
weak var a: A? = nil
deinit {
print("B deinit")
}
}
/********** delegate 常用场景解决循环引用 **********/
// RequestManager.swift
class RequestManager: RequestHandler {
@objc func requestFinished() {
print("请求完成")
}
func sendRequest() {
let req = Request()
req.delegate = self
req.send()
}
}
// Request.swift
@objc protocol RequestHandler {
optional func requestFinished()
}
class Request {
weak var delegate: RequestHandler!;
func send() {
// 发送请求
// 一般来说会将 req 的引用传递给网络框架
}
func gotResponse() {
// 请求返回
delegate?.requestFinished?()
}
}
/********** 闭包避免循环引用 **********/
class Person {
let name: String
lazy var printName: ()->() = {
print("The name is \(self.name)")
}
init(personName: String) {
name = personName
}
deinit {
print("Person deinit \(self.name)")
}
}
var xiaoMing: Person? = Person(personName: "XiaoMing")
xiaoMing!.printName()
xiaoMing = nil
// 输出:
// The name is XiaoMing,没有被释放
// 解决
lazy var printName: ()->() = {
[weak self] in
if let strongSelf = self {
print("The name is \(strongSelf.name)")
}
}