如何将自定义代码注入 Swift 中内置类的每个实例化?

Posted

技术标签:

【中文标题】如何将自定义代码注入 Swift 中内置类的每个实例化?【英文标题】:How to inject custom code into the every instantiation of a built-in class in Swift? 【发布时间】:2022-01-22 19:56:33 【问题描述】:

我需要在我的应用程序中每个UILabel 的实例化中执行一些代码。 用于调试/研究目的。

所以,我想做这样的事情:

// yep, it is not possible to override in an extension
extension UILabel 
    override init(...)  // what about arguments? overloading? no idea
        super.init(...)
        print("UILabel was created")
    


或者像这样:

// yep, it is not a valid syntax
#define UILabel MyLabel

class MyLabel : UILabel 
    override init(...)  // what about arguments? overloading? no idea
        super.init(...)
        print("UILabel was created")
    


上面的两个例子都不是一个有效的 Swift 代码,但我希望有一些正确的解决方案来将我的代码注入到每个 UILabel 的实例中。

它不一定是一个干净的解决方案。代码永远不会离开我的本地调试版本,所以只要能完成这项工作,任何肮脏的 hack 都是完全可以接受的。

谢谢。

【问题讨论】:

了解method swizzling,可能有用 【参考方案1】:

我认为在不创建自定义类的情况下将代码注入到 UILabel 的每个实例中是不可能的。

根据您的方法,我会创建一个这样的类并将其用于所有 UILabel

class MyLabel: UILabel 
    override init(frame: CGRect) 
        super.init(frame: frame)
        print("UILabel was created")
    
    
    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    


let myLabel: MyLabel = 
    let label = MyLabel()
    label.text = "123"
    return label
()

或将其用作扩展程序

extension UILabel 
    func initiate() 
        print("UILabel was created")
    


let myLabel: UILabel = 
    let label = UILabel()
    label.initiate()
    label.text = "123"
    return label
()

【讨论】:

是的,我知道这个选项。可惜我现在的项目太大了,分成了几个repos,所以很难编辑所有创建UILabel的地方。

以上是关于如何将自定义代码注入 Swift 中内置类的每个实例化?的主要内容,如果未能解决你的问题,请参考以下文章

将自定义标签注入 Java 客户端的默认 jmx Prometheus 指标

Swift:如何将自定义 UICollectionViewCell 设置为圆形?

如何将自定义 Executor 注入到 play 应用程序中?

如何以编程方式将自定义 uiview 添加到视图控制器 SWIFT

如何将自定义的 InfoWindow 添加到 google-maps swift ui 中的标记?

Swift 4 如何将自定义对象数组转换为 JSON