我可以将 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中使基类属性通用,以便可以与多种模型类型一起使用?