美文网首页
swift中 @objc的作用

swift中 @objc的作用

作者: liang1030 | 来源:发表于2024-11-24 09:15 被阅读0次

在Swift中,@objc属性具有多重作用,主要用于将Swift代码与Objective-C代码进行互操作。以下是@objc的主要用途:

  1. 暴露给Objective-C
    @objc属性可以将Swift类、属性、方法暴露给Objective-C代码。这对于需要调用Swift代码或在Swift中使用Objective-C库的情况非常有用。

    @objc class MyClass: NSObject {
        @objc var myProperty: String = "Hello, World!"
        
        @objc func myMethod() {
            print(myProperty)
        }
    }
    
  2. 支持KVO(键值观察)
    在Swift中,如果你想对一个属性进行键值观察(Key-Value Observing, KVO),该属性必须被标记为@objc dynamic@objc部分使属性可以被Objective-C看到,而dynamic部分则启用了动态派发,允许KVO机制正常工作。

    class MyObservableClass: NSObject {
        @objc dynamic var observedProperty: String = "Initial Value"
    }
    
  3. 用于选择器(Selectors)
    当需要将Swift方法传递给Objective-C API(如定时器、通知中心或UI控件的目标-动作机制)时,需要用到选择器(Selector)。这时,方法必须被标记为@objc

    class MyClass: NSObject {
        @objc func handleButtonTap() {
            print("Button tapped!")
        }
        
        func setup() {
            let selector = #selector(handleButtonTap)
            // 将selector传递给Objective-C API
        }
    }
    
  4. 与Objective-C的协议互操作
    如果Swift类需要遵循一个Objective-C定义的协议,并且该协议中的方法需要在Swift中实现,那么这些方法必须被标记为@objc

    @objc protocol MyProtocol {
        @objc func doSomething()
    }
    
    class MyClass: NSObject, MyProtocol {
        @objc func doSomething() {
            print("Doing something!")
        }
    }
    
  5. 在Swift的枚举上使用
    如果你希望将Swift枚举暴露给Objective-C,你可以使用@objc标记枚举,并且枚举必须是遵循RawRepresentableCaseIterable协议的整型(如IntString等)枚举。

    @objc enum MyEnum: Int, CaseIterable {
        case case1
        case case2
    }
    

需要注意的是,@objc标记会增加二进制大小并可能影响性能,因为它涉及到与Objective-C运行时的交互。因此,除非确实需要,否则应尽量避免在Swift代码中使用@objc


当需要将Swift方法传递给Objective-C API时,需要用到选择器(Selector)。这时,方法必须被标记为@objc。

解释:

在iOS和macOS开发中,Swift和Objective-C是两种主要的编程语言,它们可以互相调用和集成。然而,由于这两种语言在底层实现和运行时机制上有所不同,因此在进行互操作时,需要遵循一些特定的规则。

当你需要将一个Swift方法传递给一个Objective-C API时,这个API通常期望接收一个选择器(Selector)。选择器是Objective-C中的一个概念,它代表了一个可以被执行的方法的引用。与直接调用方法不同,选择器允许你在运行时动态地决定要调用哪个方法。

由于Swift在编译时会进行更多的类型检查和优化,而Objective-C则依赖于运行时系统来解析方法调用,因此Swift编译器需要知道哪些方法可能会被Objective-C代码以这种方式调用。这就是@objc属性的作用。

当你将一个Swift方法标记为@objc时,你告诉Swift编译器这个方法需要在Objective-C的运行时系统中注册。这样,当Objective-C代码通过选择器引用该方法时,运行时系统能够找到并调用它。

例如,假设你有一个Swift类,它有一个方法需要被传递给Objective-C的UIButtonaddTarget(_:action:for:)方法。这个方法需要接收一个选择器作为参数,该选择器指向要执行的方法。

class MyClass: NSObject {
    // 这个方法需要被Objective-C代码调用,因此它被标记为@objc
    @objc func buttonTapped() {
        print("Button was tapped!")
    }
    
    func setupButton() {
        let button = UIButton(type: .system)
        // 创建一个选择器,指向buttonTapped方法
        let selector = #selector(buttonTapped)
        // 将按钮的点击事件与目标(self)和选择器关联起来
        button.addTarget(self, action: selector, for: .touchUpInside)
    }
}

在这个例子中,buttonTapped方法被标记为@objc,这样它就可以在Objective-C的运行时系统中被找到和调用。然后,我们使用#selector宏来创建一个指向这个方法的选择器,并将其传递给UIButtonaddTarget(_:action:for:)方法。

总之,当你需要将Swift方法传递给Objective-C API(特别是那些期望接收选择器的API)时,你需要确保该方法被标记为@objc,以便Objective-C的运行时系统能够找到并调用它。

UIButton是Objective-C中定义的类,那addTarget(_:action:for:)就是Objective-C API

相关文章

  • @objc 在Swift中的作用

    @objc 在swift中的作用许多框架是用OC写的,在swift中定义的方法需要被作为一个selector使用时...

  • 在Swift中@objc的作用

    @objc 作用 performSelector 按钮传递后也一样

  • Swift @objc的作用

    Objective-C 和 Swift 在底层使用的是两套完全不同的机制 Cocoa 中的 Objective-C...

  • Swift中@objc的使用

    Swift中@objc的使用 在Swift代码中,使用@objc修饰后的类型,可以直接供Objective-C调用...

  • swift

    1.@objc 作用:把函数或属性编译进项目-Swift文件中,这样在OC调用Swift的方法的时候就不会报找不到...

  • Swift -tips-- lock

    objC中的@synchronized方法在Swift中做的事情是条用了objc_sync中的objc_sync_...

  • Swift 之 @objc 的作用

  • 在swift 4.0中用系统方法setValuesForKeys

    原因在swift3中,编译器自动推断@objc,换句话说,它自动添加@objc在swift4中,编译器不再自动推断...

  • Swift JSON解析

    swift4 需要在build settings中把swift 3 @objc inference 设置为on K...

  • swift name mangling

    name mangling (Location) 有什么作用? 这实际上是@objc 属性的一部分。 Swift ...

网友评论

      本文标题:swift中 @objc的作用

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