road - swift vxi




स्विफ्ट समकक्ष क्या है-[एनएसओब्जेक्ट विवरण]? (5)

जैसा कि here बताया गया here , आप स्विफ्ट की प्रतिबिंब क्षमताओं का भी उपयोग कर सकते हैं ताकि आपकी कक्षाएं इस एक्सटेंशन का उपयोग करके अपना विवरण उत्पन्न कर सकें:

extension CustomStringConvertible {
    var description : String {
        var description: String = "\(type(of: self)){ "
        let selfMirror = Mirror(reflecting: self)
        for child in selfMirror.children {
            if let propertyName = child.label {
                description += "\(propertyName): \(child.value), "
            }
        }
        description = String(description.dropLast(2))
        description += " }"
        return description
    }
}

उद्देश्य-सी में, कोई डिबगिंग में सहायता के लिए अपनी कक्षा में description विधि जोड़ सकता है:

@implementation MyClass
- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end

फिर डीबगर में, आप कर सकते हैं:

po fooClass
<MyClass: 0x12938004, foo = "bar">

स्विफ्ट में समतुल्य क्या है? स्विफ्ट का आरईपीएल आउटपुट सहायक हो सकता है:

  1> class MyClass { let foo = 42 }
  2> 
  3> let x = MyClass()
x: MyClass = {
  foo = 42
}

लेकिन मैं इस व्यवहार को कंसोल पर प्रिंट करने के लिए ओवरराइड करना चाहता हूं:

  4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)

क्या इस println आउटपुट को साफ करने का कोई तरीका है? मैंने Printable करने Printable प्रोटोकॉल देखा है:

/// This protocol should be adopted by types that wish to customize their
/// textual representation.  This textual representation is used when objects
/// are written to an `OutputStream`.
protocol Printable {
    var description: String { get }
}

मैंने सोचा कि यह स्वचालित रूप से println द्वारा "देखा" होगा लेकिन यह मामला प्रतीत नहीं होता है:

  1> class MyClass: Printable {
  2.     let foo = 42
  3.     var description: String { get { return "MyClass, foo = \(foo)" } }
  4. }   
  5> 
  6> let x = MyClass()
x: MyClass = {
  foo = 42
}
  7> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)

और इसके बजाय मुझे स्पष्ट रूप से विवरण कॉल करना होगा:

 8> println("x = \(x.description)")
x = MyClass, foo = 42

क्या कोई बेहतर तरीका है?


बस CustomStringConvertible और var description: String { return "Some string" } उपयोग करें var description: String { return "Some string" }

एक्सकोड 7.0 बीटा में काम करता है

class MyClass: CustomStringConvertible {
  var string: String?


  var description: String {
     //return "MyClass \(string)"
     return "\(self.dynamicType)"
  }
}

var myClass = MyClass()  // this line outputs MyClass nil

// and of course 
print("\(myClass)")

// Use this newer versions of Xcode
var description: String {
    //return "MyClass \(string)"
    return "\(type(of: self))"
}

CustomStringConvertible से संबंधित उत्तर जाने का तरीका हैं। व्यक्तिगत रूप से, कक्षा (या संरचना) परिभाषा को यथासंभव स्वच्छ रखने के लिए, मैं विवरण कोड को एक अलग एक्सटेंशन में भी अलग कर दूंगा:

class foo {
    // Just the basic foo class stuff.
    var bar = "Humbug!"
}

extension foo: CustomStringConvertible {
    var description: String {
        return bar
    }
}

let xmas = foo()
print(xmas)  // Prints "Humbug!"

स्विफ्ट में CustomStringConvertible और CustomDebugStringConvertible प्रोटोकॉल का उपयोग करने का उदाहरण:

PageContentViewController.swift

import UIKit

class PageContentViewController: UIViewController {

    var pageIndex : Int = 0

    override var description : String { 
        return "**** PageContentViewController\npageIndex equals \(pageIndex) ****\n" 
    }

    override var debugDescription : String { 
        return "---- PageContentViewController\npageIndex equals \(pageIndex) ----\n" 
    }

            ...
}

ViewController.swift

import UIKit

class ViewController: UIViewController
{

    /*
        Called after the controller's view is loaded into memory.
    */
    override func viewDidLoad() {
        super.viewDidLoad()

        let myPageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("A") as! PageContentViewController
        print(myPageContentViewController)       
        print(myPageContentViewController.description)
        print(myPageContentViewController.debugDescription)
    }

          ...
}

कौन सा प्रिंट आउट:

**** PageContentViewController
pageIndex equals 0 ****

**** PageContentViewController
pageIndex equals 0 ****

---- PageContentViewController
pageIndex equals 0 ----

नोट: यदि आपके पास एक कस्टम क्लास है जो UIKit या फाउंडेशन लाइब्रेरीज़ में शामिल किसी भी वर्ग से प्राप्त नहीं होती है, तो इसे NSObject क्लास का उत्तराधिकारी बनाएं या इसे CustomStringConvertible और CustomDebugStringConvertible प्रोटोकॉल के अनुरूप CustomDebugStringConvertible


struct WorldPeace: CustomStringConvertible {
    let yearStart: Int
    let yearStop: Int

    var description: String {
        return "\(yearStart)-\(yearStop)"
    }
}

let wp = WorldPeace(yearStart: 2020, yearStop: 2040)
print("world peace: \(wp)")

// outputs:
// world peace: 2020-2040






swift