获取像 NSObject 这样的描述

Getting description like NSObject

如果您运行 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)

您看到第一个 println 将输出一些调试器简介,而第二个回显 description 的内容。

所以:有没有一种方法可以让 "normal" 类 与 NSObject 的子 类 一样,所以 println 会尊重description 属性?

的内容

这是因为您正在打印 class 的实例。在 swift 中,class 不是 NSObject 的默认子 class。要使 class 成为 NSObject 的子类,您必须像对第二个 class 所做的那样指定它。这是修改后的代码:

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)

引用自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.

来自 println() API 文档:

/// 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)

因此,为了获得自定义 println() 表示,您的 class 必须(例如)明确采用 Printable 协议:

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

但是,这在 Xcode 6.1.1 的 Playground 中不起作用。 它已在 Xcode 6.3 测试版中修复。来自发行说明:

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

我在 API headers 中找不到这个,但似乎 NSObject (及其子classes)已知符合Printable。 因此自定义描述适用于您的 Test1 class.


Swift 2 (Xcode 7) 中, Printable 协议已重命名 到 CustomStringConvertible:

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

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