Method swizzling 是 Objective-C 的一项功能,它使您能够在运行时交换方法的实现。为此,您需要一个@objc
继承自NSObject
. 你需要一个方法。
Swift.print
不是一种方法。Swift
它是在模块中声明的函数。我们可以说它是全球性的,但它并不是真正的全球性。它是在模块内部定义的,Swift
它会自动导入到每个 Swift 代码中,因此您可以在没有Swift.
前缀的情况下使用它。
总之,没有办法 swizzle Swift.print
。
您可以做的是使用您自己的实现隐藏该函数,也就是说,如果您在自己的模块中声明一个具有相同名称的函数,那么当print
使用时,编译器会更喜欢您的函数,因为当前模块中的函数是优于其他模块(包括Swift.
模块)中的功能。
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
let output = items.map { "\($0)" }.joined(separator: separator)
Swift.print(output, terminator: terminator)
}
您可以在其中使用任何您想要的逻辑。
使用它从生产中删除日志实际上很常见,例如:
#if !DEBUG
func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {}
func debugPrint(_ items: Any..., separator: String = " ", terminator: String = "\n") {}
#endif
有关更多详细信息,请参阅发布版本 iOS Swift 的删除 println() 。
本质上,您可以通过在模块中重新声明它来隐藏整个Swift
模块,例如作为一个enum
,因此禁用对 的调用Swift.print
:
enum Swift {
public static func print(_ items: Any..., separator: String = " ", terminator: String = " ") {
// do something
}
}
但是,我通常建议不要这样做,因为很难解决与Swift.
模块内的标准库的任何命名冲突。
一般来说,我建议实现您的自定义日志系统并通过其他方式强制使用它,例如代码审查或 linting 规则(例如 swiftlint)。