博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift和Objective-C混合编程
阅读量:6348 次
发布时间:2019-06-22

本文共 6898 字,大约阅读时间需要 22 分钟。

1. 首先打开Xcode6。建立一个项目,这里我使用的Objective-C默认的编程语言,项目名字叫 “SwiftAndObjective”。

2. 为了在OC中使用Swift的演示所以须要建立以下的几个类。

  a)建立一个Objective-C的类继承自NSObject。名字叫OCTypeClass, 所以会自己主动产生两个相应的 .m 和 .h文件,这对熟悉Objective-C的人很熟悉。

  b)  尽力一个Swift类,名字叫SwiftFile1, 在点击创建的时候,会弹出一个提示问是否创建一个hander .h文件,这里必须选择是。

由于假设想要在Swift中使用Objective-C的类的话,这是一个必备文件,详细使用稍后再说。

结果会创建一个SwiftFile1.swift文件和一个header文件。

  c)为了描写叙述訪问控制符public、private、默认等的关系。须要再创建一个Swift文件,名字叫SwiftFile2,会生成一个SwiftFile2.swift的文件。

好了文件创建部分完成。

3. 须要定义类(由于swift能够不继承不论什么类。可是假设须要被Objective-C使用的时候,我们使用的allocnew等创建使用的方法是继承自NSObject的,所以Swift中的这些类。我都继承了NSObject了)。

 在SwiftFile1.swift文件里创建以下的类

import Foundation@objc public class PublicObjcTypeSwiftClass1: NSObject {    var property1: Int = 0}@objc class ObjcTypeSwiftClass1: NSObject {    var property1: Int = 0}@objc private class ObjcPrivateTypeSwiftClass1: NSObject {    var property1: Int = 0}public class PublicSwiftClass1 : NSObject {    var property1: Int = 0}class SwiftClass1: NSObject {    var property1: Int = 0}private class PrivateSwiftClass1: NSObject {    var property1: Int = 0}

在SwiftFile2.swift中创建以下的类

import Foundation@objc public class PublicObjcTypeSwiftClass2: NSObject {    var property1: Int = 0    //var ocClass: OCTypeClass = OCTypeClass()        //func test() {    //    ocClass.property1 = 0    //}}@objc class ObjcTypeSwiftClass2: NSObject {    var property1: Int = 0}@objc private class ObjcPrivateTypeSwiftClass2: NSObject {    var property1: Int = 0}public class PublicSwiftClass2: NSObject {    var property1: Int = 0}class SwiftClass2: NSObject {    var property1: Int = 0}private class PrivateSwiftClass2: NSObject {    var property1: Int = 0}
 

4. 由于OC文件定义之后会自己主动生成相应的类。所以无需再次定义了。

#import "OCTypeClass.h"#import "SwiftAndObjective-Swift.h"@implementation OCTypeClass- (void)test{    PublicObjcTypeSwiftClass1 *type = [[PublicObjcTypeSwiftClass1 alloc] init];    type.property1 = 0;            ObjcTypeSwiftClass1 *type2 = [[ObjcTypeSwiftClass1 alloc] init];    type2.property1 = 0;}@end

5. 打开OCTypeClass.m 文件我们须要引用Swift文件里的类。能够使用“项目project名+ ‘-’ + Swfit.h"的形式引入所以的public的而且被标记为@objc的类(标记成@objc的类,即使不显示的写出public标记也会被Objective-C类使用)。以下的详细的代码(注意当写#import “”的使用,眼下版本号的Xcode不会自己主动识别须要的Swift的header名字。须要自己手动写,注意:不要写错项目名,假设确认是写对了,可是又一直报错能够去刷新项目,或者重新启动,又一次build: Project-》 Clean, Project-》Build,大不了又一次启动Xcode)。

6.  完毕后能够通过查看源码的形式(command + 鼠标左键)的形式查看xcode自己主动生成的Objective-C类。

// Generated by Swift version 1.1 (swift-600.0.54.20)#pragma clang diagnostic push#if defined(__has_include) && __has_include(
)# include
#endif#pragma clang diagnostic ignored "-Wauto-import"#include
#include
#include
#include
#if defined(__has_include) && __has_include(
)# include
#elif !defined(__cplusplus) || __cplusplus < 201103Ltypedef uint_least16_t char16_t;typedef uint_least32_t char32_t;#endiftypedef struct _NSZone NSZone;#if !defined(SWIFT_PASTE)# define SWIFT_PASTE_HELPER(x, y) x##y# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)#endif#if !defined(SWIFT_METATYPE)# define SWIFT_METATYPE(X) Class#endif#if defined(__has_attribute) && __has_attribute(objc_runtime_name)# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))#else# define SWIFT_RUNTIME_NAME(X)#endif#if !defined(SWIFT_CLASS_EXTRA)# define SWIFT_CLASS_EXTRA#endif#if !defined(SWIFT_PROTOCOL_EXTRA)# define SWIFT_PROTOCOL_EXTRA#endif#if !defined(SWIFT_CLASS)# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted) # define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA# else# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA# endif#endif#if !defined(SWIFT_PROTOCOL)# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA#endif#if !defined(SWIFT_EXTENSION)# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)#endif#if !defined(OBJC_DESIGNATED_INITIALIZER)# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))# else# define OBJC_DESIGNATED_INITIALIZER# endif#endif#if defined(__has_feature) && __has_feature(modules)@import ObjectiveC;#endif#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"#pragma clang diagnostic ignored "-Wduplicate-method-arg"SWIFT_CLASS("_TtC17SwiftAndObjective19ObjcTypeSwiftClass1")@interface ObjcTypeSwiftClass1 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective19ObjcTypeSwiftClass2")@interface ObjcTypeSwiftClass2 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective25PublicObjcTypeSwiftClass1")@interface PublicObjcTypeSwiftClass1 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective25PublicObjcTypeSwiftClass2")@interface PublicObjcTypeSwiftClass2 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective17PublicSwiftClass1")@interface PublicSwiftClass1 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective17PublicSwiftClass2")@interface PublicSwiftClass2 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective11SwiftClass1")@interface SwiftClass1 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective11SwiftClass2")@interface SwiftClass2 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@end#pragma clang diagnostic pop

7. 以下開始在Swift文件里使用Objective-C的类。

 a)打开xcode自己主动为我们生成的SwiftAndObjective-Bridging-Header.h文件, 导入暴露给swift的类。

这里为了方便就使用刚刚定义的类,仅仅是为了演示:

#import "OCTypeClass.h"

 b)然后我们什么都不须要做了,直接在Swfit文件里实现吧。

import Foundation@objc public class PublicObjcTypeSwiftClass2: NSObject {    var property1: Int = 0    var ocClass: OCTypeClass = OCTypeClass()        func test() {        ocClass.property1 = 0    }}@objc class ObjcTypeSwiftClass2: NSObject {    var property1: Int = 0}@objc private class ObjcPrivateTypeSwiftClass2: NSObject {    var property1: Int = 0}public class PublicSwiftClass2: NSObject {    var property1: Int = 0}class SwiftClass2: NSObject {    var property1: Int = 0}private class PrivateSwiftClass2: NSObject {    var property1: Int = 0}

注意:

1. 假设想把一个Swfit类暴露给Objective-C的话须要标识@objc

2. 对于private类型的Swift类,仅仅能在所定义的Swift文件里被使用。

3. 在一个Swift文件里的类,仅仅能訪问外部Swift文件里定义的public类型的类。

差点忽略了最重要的一点:假设有什么问题或者错误,欢迎指正或者交流。

演示样例代码: 

转载地址:http://jfvla.baihongyu.com/

你可能感兴趣的文章
Session 撰改演示
查看>>
【转】python3 发邮件实例(包括:文本、html、图片、附件、SSL、群邮件)
查看>>
事务隔离级别(图文详解)
查看>>
canvas系列教程08-canvas各种坑
查看>>
浅析package.json中的devdependencies 和 dependencies
查看>>
又一个 iOS 侧边栏组件: SideMenu
查看>>
Python每日一练0019
查看>>
vue.js 打包遇到的问题
查看>>
【译】更优秀的GraphQL官方中文文档-客户端如何使用
查看>>
git pull遇到的问题
查看>>
eclipse下maven spring项目环境配置
查看>>
无缝轮播
查看>>
CTS失败项分析(2)android.telephony.cts.VisualVoicemailServiceTest#testFilter_data
查看>>
三分钟,轻松了解Dapp
查看>>
GMQ交易平台满足不同客户群体的多种投资需求
查看>>
大数据开发如何入门你必须知道这些
查看>>
关于js(es5)如何优雅地创建对象
查看>>
阿里云前端周刊 - 第 28 期
查看>>
iOS 主队列同步造成死锁的原因
查看>>
es6 下比较对象是否有修改的简要方法
查看>>