gpt4 book ai didi

ios - 如何通过扩展将类的方法与某些自定义方法混合

转载 作者:行者123 更新时间:2023-12-02 02:52:48 25 4
gpt4 key购买 nike

我正在玩 swizzling。我编写此代码是为了交换具有扩展的类的方法的实现。

@objc class A: NSObject {
@objc func name() {
print("this is class A")
}
}

extension A {
@objc func myName() {
self.myName()
print("this is my extension version of A")
}
}

@objc class B: A {
@objc override func name() {
super.name()
}

@objc override func myName() {
super.myName()
}
}

// swizzling name and myName
let originalSelector = #selector(A.name)
let swizzledSelector = #selector(A.myName)

guard let swizzledMethod = class_getInstanceMethod(A.self, swizzledSelector) else {
fatalError()
}

if let originalMethod = class_getInstanceMethod(A.self, originalSelector) {
method_exchangeImplementations(originalMethod, swizzledMethod)
print("replaced")
}

现在我运行此代码来测试它:

let b = B()
print("-----")
b.name()
print("-----")
b.myName()

我期望这个输出:

replaced
-----
this is class A
this is my extension version of A
-----
this is class A

但我在日志中实际看到的是:

replaced
-----
this is class A
-----
this is class A

我在做什么或期待错误?

最佳答案

引用swift method_exchangeImplementations not work

通过添加dynamic声明修饰符,混合可以正确发生。如果没有这个,对 method_exchangeImplementations() 的调用就不会达到预期的效果。请参阅https://swiftunboxed.com/interop/objc-dynamic/有关动态调度的更多信息。

就像这样:

@objc dynamic func name() {
print("this is class A")
}

关于ios - 如何通过扩展将类的方法与某些自定义方法混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60360881/

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