gpt4 book ai didi

ios - 如何调配 Swift.print(项目 :separator:terminator)

转载 作者:可可西里 更新时间:2023-11-01 00:54:19 27 4
gpt4 key购买 nike

我正在寻找调整 Swift.print 函数的方法。覆盖它不是一个选项,因为如果你使用 Swift.print(:)

它可能会被绕过

选择器无法识别标识符:

@objc class func printSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(print(separator:terminator:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(swizzlePrint(separator:terminator:))) else { return }
method_exchangeImplementations(instance, swizzleInstance)
}

这可能吗?因为 swizzling 是一个 obj-c 运行时特性。

最佳答案

方法调配是一项 Objective-C 功能,可让您在运行时交换方法的实现。为此,您需要一个继承自 NSObject@objc 对象。而您需要一个方法

Swift.print 不是方法。它是在 Swift 模块中声明的函数。我们可以说它是全局性的,但它并不是真正的全局性。它在模块 Swift 中定义,它会自动导入到每个 Swift 代码中,因此您可以在没有 Swift. 前缀的情况下使用它。

总而言之,没有办法调配Swift.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

参见 Remove println() for release version iOS Swift了解更多详情。

本质上,您可以通过在模块中重新声明来隐藏整个 Swift 模块,例如作为 enum,因此禁用对 Swift.print 的调用:

enum Swift {
public static func print(_ items: Any..., separator: String = " ", terminator: String = " ") {
// do something
}
}

但是,我通常建议不要这样做,因为很难解决与 Swift. 模块中的标准库的任何命名冲突。

一般来说,我会建议实现您的自定义日志记录系统并通过其他方式强制使用它,例如代码审查或 linting 规则(例如 swiftlint)。

关于ios - 如何调配 Swift.print(项目 :separator:terminator),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53993673/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com