Swift & Objc 在同一个项目中的使用

简介:

在WWDC大会中发布了Swift让人眼前一亮。终于加了很多的现代编程语言该有的东西。很早年以前玩C#3.0+的时候这些差不多类似的

已经用的烂熟的东西终于一点一点的在看Swift Programming Language的时候再唤醒。

 

 

Swift较之于OC(Objective-C)在愈发上几乎是一门新的语言了,幸运的是Swift和OC都是出自苹果大家庭,还能在一张桌子上吃饭。也就是说在升级项目

的时候你可以考虑使用Swift开发新的功能,调用已有的部分或者被已有的部分调用。或者在Swift开发的项目中使用已有的OC、C库。这样

Swift和OC共用开发一个app或者framework和只用其中一种是一样一样。当然混和语言开发app和framework上还是略有不同。

 

先说说开发app的时候混合代码编程

在Swift代码的app中无法直接引入添加的OC代码。所以在你给Swift app中添加OC文件或者在OC的app中添加Swift文件的时候Xcode会

询问你是不是要创建一个Bridging header的东西。有这个bridging headerSwfit和OC的文件之间就可以互相访问了。

                                 

生成出来的这个特殊的header文件是以你的app的名称加上“-Bridging-Header.h"的方式命名的。比如我的app的名字叫”MySwiftApp“,那

么生成出来的就叫做”MySwiftApp-Bridging-Header.h”。

 

在Swift中引入OC代码

    1. 在OC的Briding header文件中引入你要暴露给Swift的头文件。比如:

1 #import "XYZCustomCell.h"
2 #import "XYZCustomView.h"
3 #import "XYZCustomViewController.h"

 

    2. 确保Build Settings中Briding header的路径是直接指向这个文件本身,而不是其所在的目录。就像这样:

    

一般来说这个文件会默认生成,不用去管他就可以了。

 

只要是放在Briding header里的OC头文件,在Swift中就是可见的。没有任何import语句,OC文件里的方法也在Swift中可见,任意的Swift文件中可见。然后你就可以像系统生成的Swift代码那样调用你的OC代码了。

 

1 let myCell = XYZCustomCell()
2 myCell.subtitle = "A custom cell"

 

 

在OC中引入Swift代码

 

这个就方便的多了。系统在你看不见的时候就会默认的生成一个以你的app的名字加“-Swift.h”的头文件。显然这是一个OC风格的头文件,因为你要在OC代码中调用Swift代码。这个头文件和前面说的Briding header文件是一样的。强调一点,你什么都不用做,系统就会默认的生成这个文件。你需要知道的就是这个文件的命名方式:“你的app的名字-Swift.h”。在需要调用Swift代码的OC源文件中import这个文件。在这个文件中全部的OC的类型都有。如果你在Swift中使用了自定义的OC类型,那么记住在import这自动生成的文件之前,import你自定义的OC类型文件!示例:

 

#import “你的app的名字-Swift.h”

 

包含了这个文件之后,全部的Swift文件在这个OC的源文件中都是可见的。

 

 

这里总结一下。在Swift中使用OC,需要一个显式默认生成的Briding header文件,在这个文件中列出来的全部OC文件在Swift中都是可见的。也就是没有必要再在哪里import这个Briding header文件。在OC中使用Swift,Xcode会隐式的默认生成一个“你的app的名字-Swift.h”文件,在哪里用就在那里的OC源文件中import这个头文件。Swift文件的全部类型都对这个源文件可见。如果Swift中使用了其他的自定义OC类型,则在import“你的app的名字-Swift.h”之前引入这个自定义OC类型的头文件。

 

在同一个Framework中混合使用代码

在Swift中使用OC。这个原文中似乎有一个错误。下见详细:

    1. 首先确定Build Settings的Allow Non-modular includes in Framework Modules设定为Yes(注,原文中说的是Defines Module setting for that framework target is set to Yes。但是这里默认为yes,而且添加代码之后会报错)。或者把你添加的OC代码都放到Build Targe的public里面(默认的是project)。

    2. 在umbrella头文件中,import你要暴露给Swift的OC代码的头文件。例如:

  #import <MySwiftFramework/OCCode.h>

注意:在引入的时候需要在你的OC头文件前面加上Framework名称!

这样Swift就可以访问你在umbrella头文件中引入的全部OC头文件。同时这些OC头文件对应的源文件内容在无需其他import的情况下也就可以自动在Swift代码中访问到了。按照Swift的语法使用引入的OC类型,如:

复制代码
1 import Foundation
2 
3 class SwiftClass{
4     init(){
5     
6     }
7     
8     var test_code = OCCode()
9 }
复制代码

 

在OC中引入Swift

在OC代码的code base中引入Swift代码。你不需要在umbrella头文件中引入任何的Swift文件。

 这部分按照文档测试不过,稍后更新了。

 

 

 

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!














本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/3778189.html ,如需转载请自行联系原作者

相关文章
|
6月前
|
Swift
swift相关项目包含私有库引起的Undefined symbols for architecture arm64
swift相关项目包含私有库引起的Undefined symbols for architecture arm64
65 0
|
6月前
|
IDE 开发工具 Swift
创建一个Swift项目
创建一个Swift项目
114 1
|
Web App开发 搜索推荐 Linux
20 年的 Debian 开发者被排挤出项目;操作系统 “火龙” 被质疑抄袭;Swift 5.6 发布 | 思否周刊
20 年的 Debian 开发者被排挤出项目;操作系统 “火龙” 被质疑抄袭;Swift 5.6 发布 | 思否周刊
211 0
|
开发工具 Swift iOS开发
iOS 问题 1: OC项目导入swift三方库不兼容问题
iOS 问题 1: OC项目导入swift三方库不兼容问题
1086 0
iOS 问题 1: OC项目导入swift三方库不兼容问题
|
前端开发 测试技术 Swift
Swift学习笔记——新建项目
在xcode菜单中选择 new -> project -> single view app 点击next在弹出窗中填写项目名称 这里languge有可以选择object-c或swift作为项目语言。这里我们学习swift,所以选择swift。 如果language选择swift,下面的user interface可以选择swiftUI和storyboard。 SwiftUI是2019 年 WWDC 大会上,苹果在压轴环节向大众宣布了基于 Swift 语言构建的全新 UI 框架,与flutter类似,是用代码编写页面,支持快速预览。
726 0
|
开发工具 Swift iOS开发
Swift学习第二练——Swift项目时光电影
Swift学习第二练——Swift项目时光电影
161 0
Swift学习第二练——Swift项目时光电影
|
JSON 开发工具 iOS开发
在 Xcode 项目中使用 swift package fetch
本文讲的是在 Xcode 项目中使用 swift package fetch,到目前为止,Cocoa with Love 的 git 仓库都使用“git subtrees”来管理相关依赖,所有的依赖都被拷贝并静态存放于依赖方目录下。我希望能找到一种更动态地依赖管理方式来代替现有的方案
1860 0