优雅的开发Swift和Objective C混编的Framework
前言
为什么要写这样一篇文章,因为昨天和一个朋友讨论到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相关推荐
- Swift和OC的混编(一)
Swift和OC的混编(一) 由于最近swift版本趋于稳定的趋势,本人也一直在研究并尽可能的将swift用于现有的项目中,希望逐渐的替代之前的OC代码.废话不多说,直接上! 1.既然希望在OC中使用 ...
- 从预编译的角度理解Swift与Objective-C及混编机制
本文从预编译的基础知识入手,由浅至深的介绍了 Objective-C 和 Swift 的工作机制,并通过这些机制来解释混编项目中使用到的技术和各种参数的作用,由此来指导开发者如何进行混编. 写在前面 ...
- 【Swift】Swift和Objective-c混编
1.介绍 Swift和Objective-C都是苹果公司的编程语言,它们可以在同一个项目中同时使用.这种混编方式被称为"混合编程"(Mixed Programming). 在混合编 ...
- oc语言和c语言,OC和C语言的混编注意点和好处
苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++.有了它,你就能够在Objective-C利用过程中利用 ...
- 百度App Objective-C/Swift 组件化混编之路(一)
作者丨郭金.陈佳 来源丨百度App技术 一. 背景 1.1 Swift 发展历史 2010 年 7 月,克里斯(Chris Lattner)开始设计 Swift.完成基础架构后,克里斯带领开发小组陆续 ...
- Swift和Objective-C混编
Swift和Objective-C混编的注意啦 2016-10-19 13:29 编辑: 不灭的小灯灯 分类:iOS开发 来源:仁伯安的简书 0 OCSwift混编 前言 Swift已推出数年,与O ...
- Swift 与 Objective-C混编xxx-Swift.h File not found
在iOS 开发中,由于苹果14年发布了Swift语言,具备简单实用.高效等诸多优点,越来越受开发者青睐.另外,由于Objective-C多年发展和稳定性,有很多框架(特别是商业SDK)采用Object ...
- 百度App Objective-C/Swift 组件化混编之路(二)- 工程化
作者丨张渝.郭金 来源丨百度App技术 前文<百度App Objective-C/Swift 组件化混编之路>已经介绍了百度App 引入 Swift 的影响面评估以及落地的实施步骤,本文主 ...
- 初探swift语言的学习笔记九(OC与Swift混编)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...
- Swift与C++混编 OpenCV初体验 图片打码~
OpenCV初体验,给图片打码 提到OpenCV,相信大多数人都听说过,应用领域非常广泛,使用C++开发,天生具有跨平台的优势,我们学习一次,就可以在各个平台使用,这个还是很具有诱惑力的. 本文主要记 ...
最新文章
- YOLO算法史上最全综述:从YOLOv1到YOLOv5
- java反码补码原码作用_java原码补码反码关系解析
- 算法 排序 python 实现--快速排序
- .NET/ASP.NET Routing路由(深入解析路由系统架构原理)
- echarts --- 多折线图按段显示颜色规则订制
- 基于keras实现多标签分类(multi-label classification)
- STL—内存的配置与释放
- 【TWVRP】基于matlab遗传算法求解带时间窗的载重约束外卖配送车辆路径规划问题【含Matlab源码 1417期】
- Echarts实现“暂无数据”的几种方案
- cdn/github_cdn加速配置
- html编写网页超链接的标记,HTML网页超链接标记
- hana数据库导入mysql_在SAP HANA Express Edition里创建数据库表
- 前端不错的相关网站和论坛
- 接入层、汇聚层和核心层工业交换机怎么选?
- [附源码]java毕业设计校园快递管理系统
- office2019卸载组件_office2019软件安装教程
- Win 8换徽标全面整合亮点功能大阅兵——乡巴佬下载
- Android 时间转换
- 嵌入式硬件入门——74HC245三态收发器(方向可控,提供驱动)
- Metapath-guided Heterogeneous Graph Neural Network for Intent Recommendation 个人总结