Getting description like NSObject

核能气质少年 提交于 2020-01-15 11:05:02

问题


If you run the following in Playgroud

class Test {
  var description:String {
    return "This is Test"
  }
}

class Test1:NSObject {
  override var description:String {
    return "This is Test"
  }
}

let t = Test()
println(t)
let t1 = Test1()
println(t1)

you see that the first println will output some debugger blurb while the second echoes the contents of description.

So: is there a way that "normal" classes will be treated the same way as subclasses of NSObject so println will respect the contents of a description property?


回答1:


From the println() API documentation:

/// Writes the textual representation of `object` and a newline character into
/// the standard output.
///
/// The textual representation is obtained from the `object` using its protocol
/// conformances, in the following order of preference: `Streamable`,
/// `Printable`, `DebugPrintable`.
///
/// Do not overload this function for your type.  Instead, adopt one of the
/// protocols mentioned above.
func println<T>(object: T)

So in order to get a custom println() representation, your class must (e.g.) adopt the Printable protocol explicitly:

class Test : Printable {
    var description:String {
        return "This is Test"
    }
}

However, this does not work in a Playground of Xcode 6.1.1. It has been fixed in Xcode 6.3 beta. From the release notes:

• Adding conformances within a Playground now works as expected, ...

I could not find this in the API headers, but it seems that NSObject (and its subclasses) are already known to conform to Printable. Therefore the custom description works for your Test1 class.


In Swift 2 (Xcode 7), the Printable protocol has been renamed to CustomStringConvertible:

class Test : CustomStringConvertible {
    public var description:String {
        return "This is Test"
    }
}

let t = Test()
print(t)
// This is Test



回答2:


This is because you are printing out an instance of class. In swift, a class is not a default subclass of NSObject . To make a class a subClass of NSObject you have to specify it like you have done for the second class. Here's the modified code :

class Test {
  var description:String {
    return "This is Test"
  }
}

class Test1:NSObject {
  override var description:String {
    return "This is Test"
  }
}

let t = Test()
println(t.description)
let t1 = Test1()
println(t1)

Here's a quote from The Swift Programming Language,

Swift classes do not inherit from a universal base class. Classes you define without specifying a superclass automatically become base classes for you to build upon.



来源:https://stackoverflow.com/questions/28589785/getting-description-like-nsobject

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!