在調(diào)試的時(shí)候總會(huì)發(fā)現(xiàn)在輸出自定義的類與結(jié)構(gòu)體時(shí),會(huì)打印很多不想輸出的變量,這就有了CustomStringConvertible,CustomDebugStringConvertible這兩個(gè)協(xié)議的用處.
1 .Struct 中的應(yīng)用
首先定義一個(gè)結(jié)構(gòu)體,輸出這個(gè)結(jié)構(gòu)體,看 print 的結(jié)果:
struct Person {
var age: Int
var name: String
var job: String
}
let meetings = Person(age: 24, name: "haha", job: "iOSDeveloper")
print(meetings)
/**
* "Person(age: 24, name: "haha", job: "iOSDeveloper")\n"
*/
如果讓 Struct inheritance [CustomStringConvertible,CustomDebugStringConvertible],再看一下輸出結(jié)果
struct Person:CustomStringConvertible,CustomDebugStringConvertible {
var age: Int
var name: String
var job: String
var description: String {
return "\(age) \(name) \(job)"
}
var debugDescription: String {
return "\(name) \(age) \(job)"
}
}
let meetings = Person(age: 24, name: "haha", job: "iOSDeveloper")
print(meetings)
/**
* "24 haha iOSDeveloper\n"
*/
debugPrint(meetings)
/**
* "haha 24 iOSDeveloper\n"
*/
可以自定義輸出的參數(shù),這樣在調(diào)試的時(shí)候就會(huì)方便很多,好處還有不少,就不一一列舉.
2 .Class 中的應(yīng)用
定義一個(gè)類的話, print 并不會(huì)輸出類中的變量
class Wheel {
var spokes: Int = 0
var diameter: Double = 0.0
init(spokes:Int = 32,diameter:Double = 26.0) {
self.spokes = spokes
self.diameter = diameter
}
func removeSpokes() {
spokes = spokes > 0 ? spokes-- : spokes
}
}
var wheel = Wheel(spokes: 36,diameter: 29)
print(wheel)
/**
* "Wheel\n"
*/
如果想要改變 print 的輸出結(jié)果,最好用 Extension
class Wheel {
var spokes: Int = 0
var diameter: Double = 0.0
init(spokes:Int = 32,diameter:Double = 26.0) {
self.spokes = spokes
self.diameter = diameter
}
func removeSpokes() {
spokes = spokes > 0 ? spokes-- : spokes
}
}
extension Wheel: CustomDebugStringConvertible,CustomStringConvertible {
var description: String {
return "wheel has \(spokes) spokes"
}
var debugDescription: String {
return "wheel has \(spokes) spokes spokes "
}
}
var wheel = Wheel(spokes: 36,diameter: 29)
print(wheel)
/**
* "wheel has 36 spokes\n"
*/
debugPrint(wheel)
/**
* "wheel has 36 spokes spokes \n"
*/
3 ViewController,NSObject 中的應(yīng)用
如果想要改變一個(gè) ViewController 中的 print 方法,
先看沒(méi)有默認(rèn)的輸出結(jié)果
class WheelsViewController: UIViewController {
var wheels = [Wheel]()
}
var wheels = WheelsViewController()
print(wheels)
/**
* "<__lldb_expr_124.WheelsViewController: 0x7fb91a634dc0>\n"
*/
這里只輸出了className 一屆內(nèi)存地址,如果想要改變,并不能用 Extension 的方法,因?yàn)?UIViewController已經(jīng)inheritance了這兩個(gè)協(xié)議,那么就只能用 override 來(lái)實(shí)現(xiàn) DIY 的 print
class WheelsViewController: UIViewController {
var wheels = [Wheel]()
}
extension WheelsViewController {
override var description: String {
return "wheelsViewController has \(wheels)"
}
override var debugDescription: String {
return "DEBUG__wheelsViewController has \(wheels)"
}
}
var w = WheelsViewController()
w.wheels = [wheel]
print(w)
/**
* "wheelsViewController has [wheel has 36 spokes spokes ]\n"
*/
debugPrint(w)
/**
* "DEBUG__wheelsViewController has [wheel has 36 spokes spokes ]\n"
*/
這樣就得到了我們想要 print 出來(lái)的信息,方便了調(diào)試.