【已解決】swift中給一個對象添加支持print打印出對象的描述信息
問題
對于一個對象:
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
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/