25.Swift学习之@objc

作者: YungFan | 来源:发表于2018-11-28 20:20 被阅读98次

    在 Swift 中很多地方都是用到了一个修饰符@objc,尤其是在混编项目中,出于安全的考虑,可以将需要暴露给 Objective-C 使用的如类,属性和方法的声明前面加上 @objc。那么在 Swift 中哪些地方用到了这个关键字呢?

    1.本文总结的使用情况只针对 Swift4.X,代码在 Xocde10 环境下编译通过
    2.在开发中 Xcode 会提醒哪些地方需要加这个修饰符

    1. Selector 中调用的方法需要在方法前声明 @objc,目的是允许这个函数在“运行时”通过 Objective-C 的消息机制调用
    override func viewDidLoad() {
        super.viewDidLoad()
        let btn = UIButton(type: .contactAdd)     
        btn.addTarget(self, action: #selector(click), for: .touchUpInside)
    }
    @objc func click()  {      
        print("Button clicked")
    }
    
    1. 协议的方法可选时,协议和可选方法前要用 @objc声明
    @objc protocol OptionalProtocol {
        @objc optional func optionalMethold1()
        @objc optional func optionalMethold2()
    }
    
    1. 用weak修饰协议时,协议前面要用@objc声明
    @objc protocol MyDelegate{   
        func methold1()  
    }
    
    class MyClass{
        weak var delegate: MyDelegate?  
    }
    
    1. 类前加上 @objcMembers,那么它及其子类、扩展里的方法都会隐式的加上 @objc
    @objcMembers
    class Person {
    
    }
    

    如果此时在扩展里面不想加@objc,可以用@nonobjc修饰

    @objcMembers
    class Person {  
        func work(){}
    }
    
    @nonobjc extension Person{
        func eat() { } 
        func sleep() { } 
    }
    
    1. 扩展前加上 @objc,那么里面的方法都会隐式加上 @objc
    class Person {  
        func work(){}
    }
    
    @objc extension Person{
        func eat() { } //包含隐式的 @objc
        func sleep() { } //包含隐式的 @objc
    }
    

    相关文章

      网友评论

        本文标题:25.Swift学习之@objc

        本文链接:https://www.haomeiwen.com/subject/fhwzqqtx.html