我可以将 NSLog 与 Swift 结构一起使用吗?

Posted

技术标签:

【中文标题】我可以将 NSLog 与 Swift 结构一起使用吗?【英文标题】:Can I use NSLog with Swift structs? 【发布时间】:2015-09-14 22:45:27 【问题描述】:

我希望能够将NSLog 与 Swift 结构一起使用。我可以吗?我现在正在做的是:

extension CGRect 
    var description:String 
        return "\(self.left),\(self.top)_|\(self.width),\(self.height)"
    
 

NSLog("rect for something %@", self.someView.frame.description)

我曾希望只需将description var 添加到CGRect 就足够了,我不需要在NSLog() 调用中显式添加.description。但是当我尝试时,我得到了

Argument type 'CGRect' does not conform to expected type 'CVarArgType'

结构数组似乎也有类似的问题(因为数组也是结构?)

【问题讨论】:

看来你得让CGRect采用CVarArgType协议了。 我找到了CVarArgType 协议的文档,但是关于如何让一种类型采用它的细节非常少。它确实说许多值类型都采用它,所以我必须相信 CGRect 可以添加到该列表中。 【参考方案1】:

就 NSLog 而言,CGRect 不是 Swift 结构。这是一个C结构。并且已经有一个 C 函数可以让您记录一个:NSStringFromCGRect。这正是这个函数的作用

NSLog("rect for something %@", NSStringFromCGRect(self.someView.frame))

另一方面,Swift 已经为 CGRect 提供了自己的字符串表示形式,您只需通过请求该字符串即可获得它:

NSLog("rect for something %@", String(describing: self.someView.frame))

但是你不能在 任何 类型的 NSLog 调用中直接使用 CGRect。它不是具有相应格式说明符的东西。如果您想将 CGRect 与 NSLog 一起使用,您必须 通过 some 调用将其传递给 NSLog 可以处理的东西。您在 Swift 中编写此代码的事实是无关紧要的;要使用 NSLog,你必须像使用 Objective-C/C 一样使用它,因为 NSLog Objective-C/C。

不太清楚的是您为什么在这里使用 NSLog,因为听起来您不太清楚自己在做什么。此外,print 将为您执行此操作并且如果您符合 Printable(现在称为 CustomStringConvertible,因为 Apple 不在乎事物的名称有多长和多丑),它将自动调用您的 description是)。

【讨论】:

我似乎找到了很多博客,并且说 NSLog 既慢又安全(并提供诸如时间戳信息之类的东西)。这不在工作区中,所以我想我宁愿继续使用 NSLog。 我不确定如何区分 C 结构和 Swift 结构?我为各种 CG 结构添加了许多有用的扩展。这让它们在我看来非常迅速(即使是自动转换的) 你问为什么你不能删除 description 并让 NSLog 工作。我给你解释一下。你已经不在 Swift 世界里了。您正在使用 NSLog。所以现在你必须从 C 和 Objective-C 的角度来看这个世界。从他们的角度来看,CGRect 不是"%@" 对象。它不是任何类型的物体!对他们来说,它是一个 C 结构。这也是为什么您不能将它们制作成 NSArray 的原因; NSArray 只能包含对象 - 从 Objective-C 的角度来看的对象。【参考方案2】:

您可以在 swift 中为 C 结构使用“扩展”,您可以在 Xcode6(Swift1.2) 中编写它。

extension CGRect: Printable 
    public var description:String 
        return "\(self.minX),\(self.minY)_|\(self.width),\(self.height)"
    


NSLog("rect for something %@", self.view.frame.description)

结果:

2015-09-15 14:00:04.072 aaa[7330:158325] rect for something 0.0,0.0_|375.0,667.0

【讨论】:

但是没有这个必要,因为CGRect已经符合Printable(现在称为CustomStringConvertible)。

以上是关于我可以将 NSLog 与 Swift 结构一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

Airplay 不能与 Swift 的 AVRoutePicker 一起使用,但可以与 Objective C 一起使用

将 async/await (Swift 5.5) 与 firebase 实时数据库一起使用

是否有NSLog的Swift替代方案(@“%s”,__ PRETTY_FUNCTION__)

如何在swift中使基类属性通用,以便可以与多种模型类型一起使用?

将 fetchedResultsController 与 swift3 一起使用

在 Swift 项目中为生产禁用 NSLog