【已解决】swift中给一个对象添加支持print打印出对象的描述信息

donggua080 8年前
   <h2>问题</h2>    <p>对于一个对象:</p>    <pre>  <code class="language-swift">class PersonItem: ContactItem {      var personType:PersonType      var phoneNumber:String      var email:String      var position:String  }</code></pre>    <p>之前打印都是:</p>    <pre>  <code class="language-swift">print("parsed out: \(newPersonItem.type) \(newPersonItem.personType) \(newPersonItem.name) \(newPersonItem.id)")    gLog.debug("parse out \(personItem.phoneNumber) \(personItem.email) \(personItem.position) \(personItem.headerBkgColor) \(personItem.headerImage) \(personItem.headerImageLarge)")</code></pre>    <p>很是麻烦。</p>    <p>想要去添加支持,使得对于print对象,可以自动打印出对应的基本信息</p>    <h2>解决过程</h2>    <h3>1.搜:</h3>    <p>swift print object description</p>    <p><a href="/misc/goto?guid=4959673502982774775" rel="nofollow,noindex">What is the Swift equivalent of -[NSObject description]? – Stack Overflow</a></p>    <p><a href="/misc/goto?guid=4959673503077896701" rel="nofollow,noindex">swift – Getting description like NSObject – Stack Overflow</a></p>    <p><a href="/misc/goto?guid=4959673503158464211" rel="nofollow,noindex">How can I change the textual representation displayed for a type in Swift? – Stack Overflow</a></p>    <p><a href="/misc/goto?guid=4959673503253253679" rel="nofollow,noindex">Textual Representation for Classes in Swift – Venkat Peri</a></p>    <h3>2.搜:</h3>    <p>swift DebugPrintable</p>    <p>Swifter – Swift 必备 tips</p>    <p><a href="/misc/goto?guid=4959673503332945140" rel="nofollow,noindex">http://swifter.tips/print/</a></p>    <p><a href="/misc/goto?guid=4959673503417613922" rel="nofollow,noindex">ios – Implementing debugDescription for DebugPrintable in Swift – Stack Overflow</a></p>    <p><a href="/misc/goto?guid=4959673503503472797" rel="nofollow,noindex">cocoa – Difference between Printable and DebugPrintable in Swift – Stack Overflow</a></p>    <h3>变成:</h3>    <pre>  <code class="language-swift">class ContactItem:NSObject, NSCoding, CustomStringConvertible {      var type:ContactType      // person/group/topic id string      var id:String      // person name/group title/topic title      var name:String        var headerBkgColor:UIColor      //30x30, person/group/topic header image      var headerImage:UIImage      //41x41, for conversation/personal info/... use, larger size image      var headerImageLarge:UIImage        //used for SelectPersonViewController      var selected:Bool      //used for indicated whether some info is updated      var isUpdated:Bool        override var description: String {          return "\(super.description),type=\(type),id=\(id),name=\(name),headerBkgColor=\(headerBkgColor),headerImage=\(headerImage),headerImageLarge=\(headerImageLarge),selected=\(selected),isUpdated=\(isUpdated)"      }    class PersonItem: ContactItem{      var personType:PersonType      var phoneNumber:String      var email:String      var position:String        override var description: String {          return "\(super.description),personType=\(personType),phoneNumber=\(phoneNumber),email=\(email),position=\(position)"      }</code></pre>    <p>之后,代码:</p>    <pre>  <code class="language-swift">gLog.debug("personItem=\(personItem)")</code></pre>    <p>即可输出完整的信息了:</p>    <p>2016-05-20 21:46:39.280 [Debug] [NSOperationQueue 0x7b8c0ff0 :: NSOperation 0x7b8e5820 (QOS: LEGACY)] [ContactUtility.swift:613] parseCommonPersonJson(_:personItem:) > personItem=<JianDao.UserItem: 0x7b8b06c0>,type=Person,id=user-08da3990-9708-4338-ba5e-cff0586e0af8,name=crifan,headerBkgColor=UIDeviceRGBColorSpace 0.964706 0.701961 0.498039 1,headerImage=<UIImage: 0x7b646f60>, {30, 30},headerImageLarge=<UIImage: 0x7b646e20>, {41, 41},selected=false,isUpdated=false,personType=Myself,phoneNumber=13800000000,email=crifan@daryun.com,position=iOS技</p>    <h2>总结</h2>    <p>给对象加上继承符合CustomStringConvertible 协议,然后实现对应的var description: String即可</p>    <p>比如:</p>    <pre>  <code class="language-swift">class ContactItem:NSObject, NSCoding, CustomStringConvertible {      var id:String      // person name/group title/topic title      var name:String        override var description: String {          return "\(super.description),id=\(id),name=\(name)"      }  }</code></pre>    <p> </p>    <p>这样以后再去用print(或者别的log函数)去打印该变量,就不会再输出:</p>    <p>xxx Object</p>    <p>而是输出对应的description的string值了。</p>    <p> </p>    <p>来自: <a href="/misc/goto?guid=4959673503588229077" rel="nofollow">http://www.crifan.com/swift_add_print_object_class_decription_string_info/</a></p>    <p> </p>