为什么 NSLog 不支持 Swift 对象

作者:Erica Sadun,原文链接,原文日期:2016/05/02
译者:saitjr;校对:Channe;定稿:Cee

Erica,你好,在我想在 Playground 运行以下代码时,编译未通过。错误原因:“error: ‘NSLog’ is unavailable: Variadic function is unavailable NSLog(“%@”, Foo()) Foundation.NSLog:2:13: note: ‘NSLog’ has been explicitly marked unavailable here(错误:'NSLog' 不可用:可变参数函数不支持 NSLog(“%@”, Foo())。'NSLog' 在此已被标记为不可用)”。这是为什么呢?

import Foundation
class Foo {}
NSLog("%@", Foo())

首先,Foo 不是 NSObject,如果 FooNSObject 的子类,那么控制台会直接输出 “<__lldb_expr_24.Foo: 0x7fc9d2920210>”,不过,你的问题不是这个原因。

回到之前讨论的问题上来,我发现你遵循了 CustomDebugStringConvertible 协议,并用 NSLog 输出转义的字符串。

class Foo: CustomDebugStringConvertible {
    var debugDescription: String {return "Superfoo!"}
}

NSLog("\(Foo())")

其实,Swift 中的 NSLog 并不支持转义输出,如果你一定要这样做的话,应该像这样写:

class Bar: NSObject {
    override var description: String {return "Superbar!"}
}

NSLog("%@", Bar())

上面这个例子中,我选择了直接重写 NSObjectdescription 属性的 getter 方法,而不是遵循 CustomDebugStringConvertible 协议。实现 description 的getter 方法(OS X 10.10 以上),可以直接返回一个能描述内容的字符串。这样 NSLog 就能将对象转为文本方式进行显示了,即可以使用字符串格式化输出。

2016-05-02 14:12:43.106 Untitled Page 3[5161:524832] Superfoo!
2016-05-02 14:12:43.107 Untitled Page 3[5161:524832] Superbar!

如果是 Swift 原生类,NSLog 同样支持调试变量 debugDescription (OS X 10.8 以上),这是调试输出最为推荐的方式。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,876评论 0 9
  • 出题者简介: 孙源(sunnyxx),目前就职于百度,负责百度知道 iOS 客户端的开发工作,对技术喜欢刨根问底和...
    戈多_于勒阅读 5,758评论 0 5
  • 在我上幼儿园的一天,发生了一件特别灵异的事件。 吃完午饭,所有幼儿园都得睡午觉了。在我们准备睡觉,收拾床的时候,我...
    皮卡丘萌萌哒阅读 4,082评论 0 0
  • 在现今的世界里,人远比自己想象的自由。但是,大多数人,虽然口口声声说向往自由,实则害怕自由、躲避自由。他们害怕自由...
    Daisy冰阅读 1,553评论 0 0
  • 那就是我在研究性学习的四星期,想遍了人是的。
    徐阳华阅读 1,319评论 0 1

友情链接更多精彩内容