iOS中的@objc和@objcMembers实现Swift和OC的交互

目录

​​​​​​​前言

一、使用OC和Swift混编的场景

二、@objcMembers

[1.@objcMembers 的用法和示例](#1.@objcMembers 的用法和示例)

1.基本用法

[2.与@objc 的区别](#2.与@objc 的区别)

3.使用场景

[1. 与Objective-C代码互操作](#1. 与Objective-C代码互操作)

2.需要使用Objective-C运行时特性

3.避免重复的@objc修饰符

4.注意事项


前言

这篇博客主要讨论 Swift 中 @objc 和 @objcMembers 之间的区别。 。

一、使用OC和Swift混编的场景

当前我们开发iOS程序的时候,越来越多的开发者开始使用Swift 为开发语言,如果能够全部使用Swift开发,那么开发的过程肯定很舒服。但是想象是美好的,很多老项目都是使用OC开发的,当然还有一些情况,比如说项目进度比较紧,我们可能是使用到以前的OC代码,这个时候不得不同时使用OC和Swift混合在一起开发。

这个时候@objcMembers和@objc就派上用场了.

二、@objcMembers

@objcMembers 是 Swift 中的一个属性修饰符,用于将类及其所有成员(属性和方法)自动暴露给 Objective-C。这对于混合使用 Swift 和 Objective-C 代码或需要使用 Objective-C 运行时特性(如 KVO、KVC)非常有用。

1.@objcMembers 的用法和示例

1.基本用法

在类声明前使用@objcMembers修饰符,可以简化代码,不需要在每个成员前显式添加@objc修饰符。

例如我们有一个名字为Student的Swift类,代码如如下:

Swift 复制代码
@objcMembers
class Student: NSObject {
    @objc var name: String
    @objc var age: Int
    
    @objc init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    @objc func greet() {
        print("Hello, \(name)!")
    }
}

当我们加上@objcMembers修饰符之后,Student类及其所有成员都会自动暴露给 Objective-C,因此在 Objective-C 中可以直接访问 MyClass`的属性和方法。

假如我们有一个StudentManager的OC文件,我们可以通过下面的代码访问Student类的所有属性。

objectivec 复制代码
#import "StudentManager.h"
#import "objcMembersDemos-Swift.h"
@implementation StudentManager
- (void)visit{
    Student * student = [[Student alloc]initWithName:@"柱子哥" age:20];
    NSLog(@"学生姓名:%@\t学生年龄:%ld",student.name,student.age);
}
@end

2.与@objc 的区别

如果不使用@objcMembers,则需要在每个希望暴露给 Objective-C 的成员前添加 `@objc` 修饰符:

Swift 复制代码
@objcMembers
class Student: NSObject {
    @objc var name: String
    @objc var age: Int
    
    @objc init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    @objc func greet() {
        print("Hello, \(name)!")
    }
}

这种方式显得更加冗长,因此 @objcMembers提供了一种简洁的方式来处理这种情况。

3.使用场景

1. 与Objective-C代码互操作

如果你的项目中同时包含 Swift 和 Objective-C 代码,使用 @objcMembers可以使得 Swift 类的成员更方便地被 Objective-C 代码访问。

2.需要使用Objective-C运行时特性

如需在 Swift 类中使用 KVO(Key-Value Observing)、KVC(Key-Value Coding)等 Objective-C 运行时特性,使用@objcMembers可以确保这些成员正确暴露给 Objective-C 运行时。

3.避免重复的@objc修饰符

当一个 Swift 类中的大部分或全部成员都需要暴露给 Objective-C时,使用@objcMembers 可以避免在每个成员前重复添加 @objc修饰符,使代码更为简洁和易读。

4.注意事项

@objcMembers只能用于继承自NSObject的类,因为只有这样才能与 Objective-C 运行时兼容。

虽然@objcMembers可以减少代码中的重复,但不应滥用。如果仅有少量成员需要暴露给 Objective-C,还是应该显式地使用@objc修饰符。

相关推荐
了一梨41 分钟前
SQLite3学习笔记4:打开和关闭数据库 + 创建表(C API)
数据库·学习·sqlite
阿蒙Amon5 小时前
TypeScript学习-第1章:入门
javascript·学习·typescript
奥特曼_ it7 小时前
【数据分析+机器学习】基于机器学习的招聘数据分析可视化预测推荐系统(完整系统源码+数据库+开发笔记+详细部署教程)✅
笔记·数据挖掘·数据分析
A9better8 小时前
嵌入式开发学习日志50——任务调度与状态
stm32·嵌入式硬件·学习
四维碎片8 小时前
QSettings + INI 笔记
笔记·qt·算法
非凡ghost8 小时前
ESET NupDown Tools 数据库下载工具
学习·软件需求
zzcufo9 小时前
多邻国第5阶段17-18学习笔记
笔记·学习
BlackWolfSky9 小时前
鸿蒙中级课程笔记4—应用程序框架进阶1—Stage模型应用组成结构、UIAbility启动模式、启动应用内UIAbility
笔记·华为·harmonyos
中屹指纹浏览器9 小时前
指纹浏览器性能优化实操——多实例并发与资源占用管控
经验分享·笔记
brave and determined10 小时前
工程设计类学习(DAY9):印刷电路板(PCB)材料选择、工艺特性与制造技术综合详解
学习·制造·pcb·smt·工程设计·fr-4·pcb钻孔