在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的头文件。比如:

 #import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import "XYZCustomViewController.h"

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

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

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

 let myCell = XYZCustomCell()
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类型,如:

 import Foundation

 class SwiftClass{
init(){ } var test_code = OCCode()
}

在OC中引入Swift

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

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

Swift & Objc 在同一个项目中的使用的更多相关文章

  1. 【RocketMQ】同一个项目中,同一个topic,可以存在多个消费者么?

    一.问题答案 是不可以的 而且后注册的会替换前注册的,MqConsumer2会替换MqConsumer,并且只结束tag-2的消息 /** * @date 2019/05/28 */ @Compone ...

  2. django同一个项目中连接多个数据库

    一.场景与思路 同一个项目中需要连接多个数据库. 二.代码 代码中主要是三个部分,settings.models以及自己写的一个类. 1.自己写的文件:database_app_router.py  ...

  3. 在同一个项目中灵活运用application/json 和application/x-www-form-urlencoded 两种传输格式(配合axios,同时配置loading)

    'use strict' import axios from 'axios' // import qs from 'qs' import { Notification} from 'element-u ...

  4. 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架

    一直准备写这么一篇有关 SSIS 日志系统的文章,但是发现很难一次写的很完整.因为这篇文章的内容可扩展的性太强,每多扩展一部分就意味着需要更多代码,示例和理论支撑.因此,我选择我觉得比较通用的 LOG ...

  5. MVC3中在同一解决方案的不同项目中实现Area功能

    1.背景      微软在MVC中引入了Area概念,用于复杂项目的分工开发.如一个MVC项目中Controller过多时,就会导致项目中包含大量的Controller+View+Model,无论是查 ...

  6. class类名在webpack项目中的两种引用方式

    一.问题描述 在项目工程中,我们通常既用到css module,也用到普通的less文件引用方式,代码及webpack配置如下,运行时,发现只有css module起作用,如何让两者都起作用呢? // ...

  7. 在vue项目中封装echarts的正确姿势

    为什么需要封装echarts 每个开发者在制作图表时都需要从头到尾书写一遍完整的option配置,十分冗余 在同一个项目中,各类图表设计十分相似,甚至是相同,没必要一直做重复工作 可能有一些开发者忘记 ...

  8. 在Objc项目中调用Swift

    之前的文字中记录了在Swift项目中调用OC的相关代码,比较简单直接 传送门 但是在OC中调用swift代码则不是那么的和谐,网络上很多文章业已经有点陈旧.记录步骤如下: 1.创建OC项目 (1)启动 ...

  9. 在项目中同时使用Objective-C和Swift

    苹果发布的Swift语言可以和之前的Objective-C语言同时存在于一个项目中. 可能有人会认为是同一个类文件中既可以有Objective-C也可以有Swift,这是不对的.同一个类文件或同一个代 ...

随机推荐

  1. Codeforces-20152016-northwestern-european-regional-contest-nwerc-A题

    一.题目 二.题意 (1)一开始理解成:它最多需要开多少台电脑.同时,我又有个疑问,既然是最多需要开多少台,那不变成了总共有几个人开几台是最大的结果.然后,WA了无数发.直到比赛结束......其实说 ...

  2. Dev GridControl 选择行及绑定/获取List对象

    GridControl绑定List对象一般是为了获取焦点行时直接获得该行代表的List对象,或者为了实现嵌套表格,对第一中情况,起始不用绑定List,绑定DataTable也可以实现获取对应List对 ...

  3. C# Graphics中有关绘图质量的几个Mode

    一.CompositingMode 获取一个值,该值指定如何将合成图像绘制到此 Graphics.复合模式确定从源映像的像素是覆盖(SourceCopy)还是组合(SourceOver, 需要使用半透 ...

  4. 查看DNS服务器

    电脑右键查看本地连接 查看状态 然后看DNS

  5. Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA

    找到原先备份的项目,把 .idea 文件夹重新覆盖,解决问题.

  6. mysql varchar类型转换int类型

    select * from gyzd_yysinfo order by cast(yysid as SIGNED INTEGER) 或者 select * from gyzd_yysinfo orde ...

  7. C#多线程学习-求和

    1.代码如下 // *********************************************************************** // Assembly : Shar ...

  8. 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周

    java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...

  9. Think In Java 读后感

         近期拜读了Think in Java 一书,这里是一些读后感.        此书不仅仅是市面上那种教会你怎么用系统API来编程的书,那种书太多.        此书不仅仅从头开始讲述了如何 ...

  10. go_常量与枚举

    package main import ( "fmt" "math" ) //常量的数值可以作为各种类型使用 func consts(){ const file ...