Swift標(biāo)準(zhǔn)庫(kù)協(xié)議--CustomStringConvertible協(xié)議

在調(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)試.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容