前言

为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C如何混合开发Framework,中途发现了很多有意思的坑。

用Swift封装OC的库是一件比较常见的事情,毕竟对于大多数公司来说,老的代码都是用OC写的,而且经过多次迭代,这些OC的代码已经被验证了是稳定的,用Swift重写代价太大。这就引入了一个需求:

  • 用Swift和OC来混编一个Framework。

如果你之前没有用Swift和Objective C混合开发,建议看看这篇文档:

  • Swift and Objective-C in the Same Project

这篇文档很详细的讲解了如何运用Objective C和Swift进行混合开发App和Framework。于是,我们先按照文档来写一个混编的Framework


按照文档一步一步来

新建一个基于单页面工程,然后新建一个一个Target,选中Cocoa Touch Framework。然后,分别新建一个Swift文件和Objective C类,注意Target Member Ship选中Framework。类的内容如下:

OCSource.h

#import <Foundation/Foundation.h>@interface OCSource : NSObject
- (void)functionFromOC;
@end

OCSource.m

#import "OCSource.h"@implementation OCSource- (void)functionFromOC{NSLog(@"%@",@"Log from objective c in framework");
}
@end

Swift调用OC

新建SwiftSource.swift

open class SwiftIt{public init(){}let ocObject = OCSource()public func encapsulate(){ocObject.functionFromOC()}
}

然后,按照文档中,为了让Swift文件访问Objective C文件,我们应该在umbrella header,也就是MixFramework.h中,暴露所需要的header。

也就是,MixFramework.h,

#import <MixFramework/OCSource.h>

然后,自信满满的点击build。

Boom~~~,编译不通过。

原因:OCSource.h默认编译的时候是Project权限. 为了在umbrella header中使用,要把这个文件的权限改成Public

按照图中的方式拖过去即可。

嗯,现在build,可以看到build成功了。

OC调用Swift

在SwiftSource.swift中,增加一个类,

open class ClassForOC:NSObject{public static let textForOC = "textForOC"
}

然后,为了在OC中调用Swift的方法,我们需要导入头文件,这时候,OCSource.m文件内容如下

#import "OCSource.h"
#import <MixFramework/MixFramework-Swift.h>@implementation OCSource- (void)functionFromOC{NSLog(@"%@",[ClassForOC textForOC]);
}
@end

然后,build,发现成功了,很开心。


外部调用

在ViewController.swift中,我们调用Framework中的内容。

import MixFramework
class ViewController: UIViewController {var t = SwiftIt()override func viewDidLoad() {super.viewDidLoad()t.encapsulate()// Do any additional setup after loading the view, typically from a nib.}override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()// Dispose of any resources that can be recreated.}
}

然后运行,发现控制台打印出

2017-03-02 16:08:24.000 HostApplication[19524:167669] textForOC

嗯,framework打包成功了。


问题

通常,我们希望暴露给外部的接口是纯Swift,而OC文件的具体接口应该隐藏,这就是我标题中的优雅两个字的含义。

如果你好奇,你会发现,在ViewController.swift中你可以这么调用

    var s = OCSource()

也就是说,OC的内容也暴露出来了,这破坏了Framework的封装特性

通过查看MixFramework的编译结果,发现最后暴露出的接口是这样子的

import Foundation
import MixFramework.OCSource
import MixFramework
import MixFramework.Swift
import SwiftOnoneSupport
import UIKit//
//  MixFramework.h
//  MixFramework
//
//  Created by Leo on 2017/3/2.
//  Copyright © 2017年 Leo Huang. All rights reserved.
////! Project version number for MixFramework.
public var MixFrameworkVersionNumber: Double
open class ClassForOC : NSObject {public static let textForOC: String
}open class SwiftIt {public init()public func encapsulate()
}

这一行,把OC对应的实现暴露出来了

import MixFramework.OCSource

优雅的解决方案

不再通过umbrella header的方式让framework中的Swift调用OC方法。而是通过modulemap

新建一个module.modulemap文件,内容如下


module OCSource [system] {//由于module.modulemap和OCSource.h是在同一个文件夹的,如果不是同一个,路径要写全header "OCSource.h"export *
}

这里的$(SRCROOT)是XCode的宏,会自动替换成项目所在的根目录,这里输入的路径是module.modulemap文件所在的路径。

然后,删除MixFramework.h(umbrella header)中#import 的OC header。

把OCSource.h的权限改回默认的project。

再编译,发现OC的类被隐藏了。


总结

如果你要开发一个framework,一定要想清楚哪些接口暴露出去,哪些封装起来,framework不是简单把一包文件加个壳子。

Demo下载

优雅的开发Swift和Objective C混编的Framework相关推荐

  1. Swift和OC的混编(一)

    Swift和OC的混编(一) 由于最近swift版本趋于稳定的趋势,本人也一直在研究并尽可能的将swift用于现有的项目中,希望逐渐的替代之前的OC代码.废话不多说,直接上! 1.既然希望在OC中使用 ...

  2. 从预编译的角度理解Swift与Objective-C及混编机制

    本文从预编译的基础知识入手,由浅至深的介绍了 Objective-C 和 Swift 的工作机制,并通过这些机制来解释混编项目中使用到的技术和各种参数的作用,由此来指导开发者如何进行混编. 写在前面 ...

  3. 【Swift】Swift和Objective-c混编

    1.介绍 Swift和Objective-C都是苹果公司的编程语言,它们可以在同一个项目中同时使用.这种混编方式被称为"混合编程"(Mixed Programming). 在混合编 ...

  4. oc语言和c语言,OC和C语言的混编注意点和好处

    苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++.有了它,你就能够在Objective-C利用过程中利用 ...

  5. 百度App Objective-C/Swift 组件化混编之路(一)

    作者丨郭金.陈佳 来源丨百度App技术 一. 背景 1.1 Swift 发展历史 2010 年 7 月,克里斯(Chris Lattner)开始设计 Swift.完成基础架构后,克里斯带领开发小组陆续 ...

  6. Swift和Objective-C混编

    Swift和Objective-C混编的注意啦 2016-10-19 13:29 编辑: 不灭的小灯灯 分类:iOS开发 来源:仁伯安的简书 0  OCSwift混编 前言 Swift已推出数年,与O ...

  7. Swift 与 Objective-C混编xxx-Swift.h File not found

    在iOS 开发中,由于苹果14年发布了Swift语言,具备简单实用.高效等诸多优点,越来越受开发者青睐.另外,由于Objective-C多年发展和稳定性,有很多框架(特别是商业SDK)采用Object ...

  8. 百度App Objective-C/Swift 组件化混编之路(二)- 工程化

    作者丨张渝.郭金 来源丨百度App技术 前文<百度App Objective-C/Swift 组件化混编之路>已经介绍了百度App 引入 Swift 的影响面评估以及落地的实施步骤,本文主 ...

  9. 初探swift语言的学习笔记九(OC与Swift混编)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  10. Swift与C++混编 OpenCV初体验 图片打码~

    OpenCV初体验,给图片打码 提到OpenCV,相信大多数人都听说过,应用领域非常广泛,使用C++开发,天生具有跨平台的优势,我们学习一次,就可以在各个平台使用,这个还是很具有诱惑力的. 本文主要记 ...

最新文章

  1. YOLO算法史上最全综述:从YOLOv1到YOLOv5
  2. java反码补码原码作用_java原码补码反码关系解析
  3. 算法 排序 python 实现--快速排序
  4. .NET/ASP.NET Routing路由(深入解析路由系统架构原理)
  5. echarts --- 多折线图按段显示颜色规则订制
  6. 基于keras实现多标签分类(multi-label classification)
  7. STL—内存的配置与释放
  8. 【TWVRP】基于matlab遗传算法求解带时间窗的载重约束外卖配送车辆路径规划问题【含Matlab源码 1417期】
  9. Echarts实现“暂无数据”的几种方案
  10. cdn/github_cdn加速配置
  11. html编写网页超链接的标记,HTML网页超链接标记
  12. hana数据库导入mysql_在SAP HANA Express Edition里创建数据库表
  13. 前端不错的相关网站和论坛
  14. 接入层、汇聚层和核心层工业交换机怎么选?
  15. [附源码]java毕业设计校园快递管理系统
  16. office2019卸载组件_office2019软件安装教程
  17. Win 8换徽标全面整合亮点功能大阅兵——乡巴佬下载
  18. Android 时间转换
  19. 嵌入式硬件入门——74HC245三态收发器(方向可控,提供驱动)
  20. Metapath-guided Heterogeneous Graph Neural Network for Intent Recommendation 个人总结

热门文章

  1. 九、 Excel二维码制作和插件推荐
  2. 网联兴,银联苦:一文看清支付清算市场新局面的矛盾和疑惑
  3. android 哈哈镜,Carnival Mirror App(哈哈镜模拟器)
  4. magicdraw 2022x
  5. ROBOGUIDE软件:FANUC机器人弧焊焊接起始点接触寻位虚拟仿真
  6. SHT30温湿度传感器使用记录(AVR atmega128)
  7. 分布式配置管理平台VS统一集中配置管理
  8. masm5 0的使用介绍
  9. 计算机系统的基础必备软件,电脑必装软件推荐:基础篇——够用就行
  10. Translation 翻译插件google