成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

優雅的開發Swift和Objective-C混編的Framework

移動開發 iOS
用Swift封裝OC的庫是一件比較常見的事情,畢竟對于大多數公司來說,老的代碼都是用OC寫的,而且經過多次迭代,這些OC的代碼已經被驗證了是穩定的,用Swift重寫代價太大。這就引入了一個需求:用Swift和OC來混編一個Framework。

前言

為什么要寫這樣一篇文章,因為昨天和一個朋友討論到Swift和Objective C如何混合開發Framework,中途發現了很多有意思的坑。

用Swift封裝OC的庫是一件比較常見的事情,畢竟對于大多數公司來說,老的代碼都是用OC寫的,而且經過多次迭代,這些OC的代碼已經被驗證了是穩定的,用Swift重寫代價太大。這就引入了一個需求:

  • 用Swift和OC來混編一個Framework。

如果你之前沒有用Swift和Objective C混合開發,建議看看這篇文檔:

  • Swift and Objective-C in the Same Project

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

按照文檔一步一步來

新建一個基于單頁面工程,然后新建一個一個Target,選中Cocoa Touch Framework。然后,分別新建一個Swift文件和Objective C類,注意Target Member Ship選中Framework。類的內容如下:

OCSource.h

  1. #import <span class="hljs-title"><Foundation/Foundation.h></span> 
  2.  
  3.   
  4.  
  5. @interface OCSource : NSObject 
  6.  
  7. - (void)functionFromOC; 
  8.  
  9. @end  

OCSource.m

  1. #import "OCSource.h" 
  2.  
  3.   
  4.  
  5. @implementation OCSource 
  6.  
  7.   
  8.  
  9. - (void)functionFromOC{ 
  10.  
  11.     NSLog(@"%@",@"Log from objective c in framework"); 
  12.  
  13.  
  14. @end  

Swift調用OC

新建SwiftSource.swift

  1. open class SwiftIt{ 
  2.  
  3.     public init(){} 
  4.  
  5.     let ocObject = OCSource() 
  6.  
  7.     public func encapsulate(){ 
  8.  
  9.         ocObject.functionFromOC() 
  10.  
  11.     } 
  12.  
  13.  

然后,按照文檔中,為了讓Swift文件訪問Objective C文件,我們應該在umbrella header,也就是MixFramework.h中,暴露所需要的header。

也就是,MixFramework.h,

  1. #import <MixFramework/OCSource.h> 

然后,自信滿滿的點擊build。

Boom~~~,編譯不通過。 

 

 

 

原因:OCSource.h默認編譯的時候是Project權限. 為了在umbrella header中使用,要把這個文件的權限改成Public

按照圖中的方式拖過去即可。 

 

 

 

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

OC調用Swift

在SwiftSource.swift中,增加一個類,

  1. open class ClassForOC:NSObject{ 
  2.  
  3.     public static let textForOC = "textForOC" 
  4.  
  5.  

然后,為了在OC中調用Swift的方法,我們需要導入頭文件,這時候,OCSource.m文件內容如下

  1. #import "OCSource.h" 
  2.  
  3. #import <MixFramework/MixFramework-Swift.h> 
  4.  
  5.   
  6.  
  7. @implementation OCSource 
  8.  
  9.   
  10.  
  11. - (void)functionFromOC{ 
  12.  
  13.     NSLog(@"%@",[ClassForOC textForOC]); 
  14.  
  15.  
  16. @end  

然后,build,發現成功了,很開心。

外部調用

在ViewController.swift中,我們調用Framework中的內容。

  1. import MixFramework 
  2.  
  3. class ViewController: UIViewController { 
  4.  
  5.     var t = SwiftIt() 
  6.  
  7.     override func viewDidLoad() { 
  8.  
  9.         super.viewDidLoad() 
  10.  
  11.         t.encapsulate() 
  12.  
  13.         // Do any additional setup after loading the view, typically from a nib. 
  14.  
  15.     } 
  16.  
  17.   
  18.  
  19.     override func didReceiveMemoryWarning() { 
  20.  
  21.         super.didReceiveMemoryWarning() 
  22.  
  23.         // Dispose of any resources that can be recreated. 
  24.  
  25.     } 
  26.  
  27.  

然后運行,發現控制臺打印出

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

嗯,framework打包成功了。

問題

通常,我們希望暴露給外部的接口是純Swift,而OC文件的具體接口應該隱藏,這就是我標題中的優雅兩個字的含義。

如果你好奇,你會發現,在ViewController.swift中你可以這么調用

  1. var s = OCSource() 

也就是說,OC的內容也暴露出來了,這破壞了Framework的封裝特性。

通過查看MixFramework的編譯結果,發現***暴露出的接口是這樣子的

  1. import Foundation 
  2.  
  3. import MixFramework.OCSource 
  4.  
  5. import MixFramework 
  6.  
  7. import MixFramework.Swift 
  8.  
  9. import SwiftOnoneSupport 
  10.  
  11. import UIKit 
  12.  
  13.   
  14.  
  15. // 
  16.  
  17. //  MixFramework.h 
  18.  
  19. //  MixFramework 
  20.  
  21. // 
  22.  
  23. //  Created by Leo on 2017/3/2. 
  24.  
  25. //  Copyright © 2017年 Leo Huang. All rights reserved. 
  26.  
  27. // 
  28.  
  29.   
  30.  
  31. //! Project version number for MixFramework. 
  32.  
  33. public var MixFrameworkVersionNumber: Double 
  34.  
  35. open class ClassForOC : NSObject { 
  36.  
  37.   
  38.  
  39.     public static let textForOC: String 
  40.  
  41.  
  42.   
  43.  
  44. open class SwiftIt { 
  45.  
  46.   
  47.  
  48.     public init() 
  49.  
  50.   
  51.  
  52.     public func encapsulate() 
  53.  
  54.  

這一行,把OC對應的實現暴露出來了

  1. import MixFramework.OCSource 

優雅的解決方案

不再通過umbrella header的方式讓framework中的Swift調用OC方法。而是通過modulemap。

新建一個module.modulemap文件,內容如下

  1. module OCSource [system] { 
  2.  
  3.     //由于module.modulemap和OCSource.h是在同一個文件夾的,如果不是同一個,路徑要寫全 
  4.  
  5.     header "OCSource.h" 
  6.  
  7.     export * 
  8.  
  9.   

 

 

 

這里的#(SRCROOT)是XCode的宏,會自動替換成項目所在的根目錄,這里輸入的路徑是module.modulemap文件所在的路徑。

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

把OCSource.h的權限改回默認的project。 

 

 

 

再編譯,發現OC的類被隱藏了。

總結

如果你要開發一個framework,一定要想清楚哪些接口暴露出去,哪些封裝起來,framework不是簡單把一包文件加個殼子。 

責任編輯:龐桂玉 來源: iOS大全
相關推薦

2011-07-29 15:47:21

iPhone開發 Objective- C

2011-04-08 10:51:17

Objective-CiOS

2014-09-26 09:49:48

SwiftObjective-C

2014-07-01 09:22:01

SwiftObjective-CiOS

2014-10-13 09:54:08

Objective-CSwift

2015-02-05 00:18:44

SwiftObjective-C

2015-06-08 10:02:40

swiftOC兼容

2012-04-23 11:00:56

iOS開發Objective-CJavaScript

2014-09-24 11:15:05

Objective-CSwift

2014-06-05 13:54:03

SwiftiOSObjective-C

2014-04-01 10:50:42

iOS開發runtimeObjective-C

2022-07-11 10:17:19

Swift編程語言項目

2014-06-16 10:02:42

SwiftiOSWWDC

2013-05-02 10:51:17

iOS開發Objective-C@property

2014-11-25 10:18:17

Objective-C

2014-07-29 09:44:35

2013-04-11 13:41:30

Objective-CiOS編程

2011-08-03 16:22:05

Objective-C CodeBlocks

2011-08-10 18:07:29

Objective-C反射

2015-05-14 10:26:37

Objective-CSwift
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲成人av在线播放 | 黄视频在线网站 | 久久精品二区 | 在线播放一区二区三区 | 亚洲黄色一区二区三区 | 国产精品视频免费看 | 久久成人精品视频 | 亚洲欧美高清 | 毛片在线免费播放 | 国产91精品在线 | 国产精品毛片一区二区三区 | 精品视频一区二区三区在线观看 | 欧美日韩一区二区在线观看 | 欧美日韩不卡合集视频 | 99免费在线视频 | 精品视频一区二区三区在线观看 | 自拍偷拍中文字幕 | 毛片免费看的 | 北条麻妃国产九九九精品小说 | 天堂男人av | 久久久成人动漫 | 日韩免费毛片视频 | 国产在线a视频 | 欧美日韩电影一区二区 | 一区二区中文字幕 | 欧美在线一区二区三区 | 久久国产免费看 | 欧美成人免费在线视频 | 国产精品欧美一区二区三区不卡 | 中文字幕成人免费视频 | 国产区精品在线观看 | 色啪网| 欧美专区在线 | 成人免费淫片aa视频免费 | 日韩精品一区二区三区中文字幕 | 国产精品一区二区不卡 | 亚洲午夜视频 | 黄网免费看 | 欧美激情视频一区二区三区在线播放 | 欧美一区二区在线播放 | 狠狠插天天干 |