Skip to content

Swift Method Swizzling 实现方式 #87

@resse92

Description

@resse92
public extension UIColor {
    @objc func colorDescription() -> String {
        return "print rainbow colours"
    }
    private static let swizzleDescriptionImplementation: Void = {
        let instance: UIColor = UIColor.red
        let aClass: AnyClass! = object_getClass(instance)
        let originalMethod = class_getInstanceMethod(aClass, #selector(description))
        let swizzleMethod = class_getInstanceMethod(aClass, #selector(colorDescription))
        if let originalMethod = originalMethod, let swizzleMethod = swizzleMethod {
            method_exchangeImplementations(originalMethod, swizzleMethod)
        }
    }()
    
    public static func swizzleDesription() {
        _ = self.swizzleDescriptionImplementation
    }
}

override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(tableView)
        
        print(UIColor.red)
        print(UIColor.green)
        UIColor.swizzleDesription()
        print("\nswizzled\n")
        print(UIColor.red)
        print(UIColor.red)
        UIColor.swizzleDesription()
        print("\nTrying to swizzle again\n")
        print(UIColor.red)
        print(UIColor.red)
    }

通过打印结果可见多次swizzleDescription操作,只会生效一次,并不会重复swizzle
详情请见Method swizzling in iOS swift

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions