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 条评论
登录 后参与评论

相关文章

来自专栏黑白安全

PHP中函数和语言结构的区别

关于PHP中的函数和语言结构的区别,本文给大伙逐步分析。函数众所周知它的三要素为:函数名、参数、返回值,调用方式采用函数名加括号()的形式进行调用。语言结构可以...

13420
来自专栏小灰灰

Java学习之深拷贝浅拷贝及对象拷贝的两种方式

I. Java之Clone 0. 背景 对象拷贝,是一个非常基础的内容了,为什么会单独的把这个领出来讲解,主要是先前遇到了一个非常有意思的场景 有一个任务,需要...

41790
来自专栏Objective-C

Swift 基本语法02-"let"和"var"

23160
来自专栏ShaoYL

1.了解Objective-C语言

366100
来自专栏阿杜的世界

Java泛型的局限和使用经验泛型的局限泛型的常用经验参考资料

//使用泛型类 @Data @Builder @AllArgsConstructor @NoArgsConstructor public class Data...

8720
来自专栏开发与安全

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

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

36200
来自专栏老九学堂

十七个C语言新手编程时常犯的错误及解决方式

C编译的程序对语法检查并不像其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常...

32970
来自专栏大壮

iOS block的一些理解和注意点

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

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

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

22170
来自专栏木木玲

Reference 、ReferenceQueue 详解

37270

扫码关注云+社区

领取腾讯云代金券