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

Can I use NSLog with Swift structs?

我希望能够将 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 就足够了,我不需要显式添加 .descriptionNSLog() 调用中。但是当我尝试时,我得到

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

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

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

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 不关心如何事物的名称又长又丑。

您可以在 swift 中将 'extension' 用于 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