25.Swift学习之@objc

在 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() { } //包含隐式的 @objc
    func sleep() { } //包含隐式的 @objc
}
  1. 扩展前加上 @objc,那么里面的方法都会隐式加上 @objc
class Person {  
    func work(){}
}
@objc extension Person{
    func eat() { } //包含隐式的 @objc
    func sleep() { } //包含隐式的 @objc
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

从零开始学C++之动态创建对象

回顾前面的文章,实现了一个简单工厂模式来创建不同类对象,但由于c++没有类似new "Circle"之类的语法,导致CreateShape 函数中需要不断地i...

3190
来自专栏ShaoYL

1.了解Objective-C语言

1156
来自专栏岑志军的专栏

(1)Objective-C的本质

1185
来自专栏ShaoYL

OC内存管理

3719
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之用两个栈实现队列(九度OJ1512)

题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 输入: 每个输入文件包含一个测试样例。 对于每个测试样例,第一...

1985
来自专栏雨尘分享

3. __block  __weak  __strong   这都是做什么的

1933
来自专栏一个会写诗的程序员的博客

《一切皆是映射:代码的本质》Java 动态读取源代码,并编译 & 加载执行

动态的执行一段简单代码,采用生成java文件,调用javac编译,反射执行的方式。

2033
来自专栏码云1024

python简明笔记

通过 for 语句我们可以使用 for 循环。Python 里的 for 循环与 C 语言中的不同。这里的 for 循环遍历任何序列(比如列表和字符串)中的每一...

5779
来自专栏偏前端工程师的驿站

Java魔法堂:四种引用类型、ReferenceQueue和WeakHashMap

一、前言                               JDK1.2以前只提供一种引用类型——强引用 Object obj = new Objec...

2037
来自专栏mukekeheart的iOS之旅

OC学习9——反射机制

1、OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作。 通过NSObje...

2995

扫码关注云+社区