【已解決】swift中給一個對象添加支持print打印出對象的描述信息

donggua080 8年前發布 | 16K 次閱讀 Swift Swing Java開發

問題

對于一個對象:

class PersonItem: ContactItem {
    var personType:PersonType
    var phoneNumber:String
    var email:String
    var position:String
}

之前打印都是:

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>

很是麻煩。

想要去添加支持,使得對于print對象,可以自動打印出對應的基本信息

解決過程

1.搜:

swift print object description

What is the Swift equivalent of -[NSObject description]? – Stack Overflow

swift – Getting description like NSObject – Stack Overflow

How can I change the textual representation displayed for a type in Swift? – Stack Overflow

Textual Representation for Classes in Swift – Venkat Peri

2.搜:

swift DebugPrintable

Swifter – Swift 必備 tips

http://swifter.tips/print/

ios – Implementing debugDescription for DebugPrintable in Swift – Stack Overflow

cocoa – Difference between Printable and DebugPrintable in Swift – Stack Overflow

變成:

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> 

之后,代碼:

gLog.debug("personItem=\(personItem)")

即可輸出完整的信息了:

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技

總結

給對象加上繼承符合CustomStringConvertible 協議,然后實現對應的var description: String即可

比如:

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)"
    }
}

 

這樣以后再去用print(或者別的log函數)去打印該變量,就不會再輸出:

xxx Object

而是輸出對應的description的string值了。

 

來自: http://www.crifan.com/swift_add_print_object_class_decription_string_info/

 

 本文由用戶 donggua080 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!