Siwft与Objective-C混编

Swift与Objective-C的兼容能力允许你在同一个工程中同时使用两种语言。你可以用这种叫做“mix and match”的特性来开发基于混合语言的应用。使用Swfit的最新特性--“mix and match”,你可以实现应用的一部分功能,并无缝地并入已有的Objective-C的代码中。

Mix and Match 概述


Swift与Objective-C文件可以在一个工程中并存,不管这个工程原本是基于Objective-C还是Swift。你可以直接往现有工程中简单地添加另一种语言的文件。这种自然的工作流使得创建混合语言的应用或framework target,与用单独一种语言时一样简单。

编写混合语言的工作流程只有一点点区别,这取决于你是在写应用还是写框架。下面描述了用两种语言在一个target中导入模型的情况,后续章节会有更多细节。

Siwft与Objective-C混编_第1张图片
swift&OC  bridging

在同一个App Target中进行代码导入


要在同一个app target中导入Objective-C文件供Swift使用,你需要依赖Objective-C的桥接头文件(Objective-C bridging header)来暴露给 Swift。当你添加 Swift 文件到现有的Objective-C应用时,Xcode 会自动创建这些头文件,反之亦然。

Siwft与Objective-C混编_第2张图片

如果你同意,Xcode 会在源文件创建的同时生成头文件,并用product的模块名加上 -Bridging-Header.h命名。如果手动创建,则按如下步骤。

一. swift调用Objective-C代码

Xcode对于Swift调用Objective-c代码,除宏定义外,其它支持相对完善。

1.1 使用Objetvie-c的第一步

告诉Xcode、哪些Objective-c类要使用,新建.h头文件,文件名可以任意取,建议采用“项目名-Bridging-Header.h”命令格式。

Siwft与Objective-C混编_第3张图片

Swift之IOS项目,在Xcode6创建类文件,默认会自动选择OS X标签下的文件,这时一定要选择iOS标签下的文件,否则会出现语法智能提示不起作用,严重时会导致打包出错。

1.2  Target配置,使创建的头文件生效

Siwft与Objective-C混编_第4张图片
桥接文件配置

设置Objective-C Bridging Header时,路径要配置正确,写法如下:

$(PROJECT_DIR)/*-Bridging-Header.h

二. Objective-c调用Swift代码

2.1 Objective-c调用Swift代码两个步骤

第一步 告诉Xcode哪些类需要使用(继承自NSObject的类自动处理,不需要此步骤),通过关键字@objc(className)来标记

importUIKit

@objc(ILWriteBySwift)

class ILWriteBySwift{

var   name:String!

class  func  newInstance()->ILWriteBySwift{

          return   ILWriteBySwift()

}

}

第二步引入头文件,Xcode头文件的命名规则为

$(SWIFT_MODULE_NAME)-Swift.h

配置如下:

Siwft与Objective-C混编_第5张图片
oc —>swift bridging

2.2  找不到$(SWIFT_MODULE_NAME)-Swift.h

1.遇到此问题可按以下步骤做常规性检查

1.确定导入SWIFT_MODULE_NAME)-Swift.h头文件的文件名正确

2.SWIFT_MODULE_NAME)-Swift.h在clean后没有重新构建,执行Xcode->Product->Build

2.头文件循环

在混合编程的项目中,由于两种语言的同时使用,经常会出现以下需求:在Swift项目中需要使用Objectvie-c写的A类,而A类又会用到Swift的一些功能,头文件的循环,导致编译器不能正确构建$(SWIFT_MODULE_NAME)-Swift.h,遇到此问题时,在.h文件做如下处理

//删除以下头文件

//#import "ILSwift-Swift.h"

//通过代码导入类

@class  ILSwiftBean;

在Objevtive-c的.m文件最上面,添加

#import "ILSwift-Swift.h"

出现Use of undecalared identifier错误或者找不到方法,如下:

错误

引起的原因有以下几种可能:

1.使用的Swift类不是继承自NSObject,加入关键字即可

2.SWIFT_MODULE_NAME)-Swift.h没有实时更新,Xcode->Product->Build

3.此Swift文件中使用了Objective-c不支持的类型或者语法,如private

出现部分方法找不到的问题,Xcode无智能提示:

此方法使用了Objective-c不支持的类型或者语法

苹果官方给出的不支持转换的类型

Generics

Tuples

Enumerations defined in Swift

Structures defined in Swift

Top-level functions defined in Swift

Global variables defined in Swift

Typealiases defined in Swift

Swift-style variadics

Nested types

Curried functions


参考文章:

 Swift项目兼容Objective-c问题汇总

在Swift项目中使用OC,在OC项目中使用Swift

你可能感兴趣的:(Siwft与Objective-C混编)