如何将自定义代码注入 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