iOS8开发~Swift(五)Swift与OC混编

一、概要

首先看《The Swift Programming Language》中提到“Swift’s compatibility with Objective-C lets you create a project that contains files written in either language. ”,意思是在一个项目中可以混合使用Swift和Objective-C,你可能有疑问了:

1、如何让两种语言在一个项目中使用? 

2、混编的项目是“Swift项目”还是“OC项目”?

3、混编过程中,需要注意哪些细节?

仅凭看文档可能会感觉没有头绪,所以还是实际动手试一试吧。


二、混编

1、OC项目中混编

(1)首先创建一个项目,命名TestOC,语言选择Objective-C,不熟悉的可以参考这里

(2)创建好项目后,在项目中添加一个新文件 New File -> Cocoa Class 语言选择Swift,命名为FileTest,选择Create的时候,会弹出如下页面:



选择Yes,然后Xcode不仅创建了 FileTest.swift 文件,还创建了 TestOC-Bridging-Header.h 文件



这个文件什么作用,看文档:



向一个OC项目中添加Swift文件或者向一个Swift项目中添加OC文件,Xcode会自动生成ProName-Bridging-Header.h,作用就是告诉OC项目或Swift项目,这个Swift文件或者OC文件对外提供的内容,从命名“Bridging”也能大概猜到文件的用意。

选择直接编译会报错,不要着急,修改刚创建的文件 FileTest.swift 中的代码:

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. import Foundation  
  2.   
  3. @objc(FileTest)  
  4. class FileTest: NSObject {  
  5.     @objc(initWithData:)  
  6.     init (data: String) {  
  7.         println(data)  
  8.     }  
  9. }  

这里看到了 @objc()这种奇怪到写法,官网是这样描述的,意思是用 @objc() 想让一个Swift类被OC调用



 选择Swift文件中的类也定义好了,但发现在OC没办法调用,因为OC选择找不到 FileTest 类,这就需要配置一个参数:Build Setting -> Product Module Name,默认是没有配置的,Target -> Build Setting  ->Defines Module修改成Yes:



选择在需要使用Swift文件类的地方引入头文件:#import "MyTest-Swift.h",然后在看效果:



Swift中定义的类,可以在OC中使用了,MyTest-Swift.h 文件是什么?他是Xcode自动创建的,点击进去看看里边有什么:



这样就几乎明白个七七八八了。


现在可以实现OC中调用Swift了,那Swift中如何调用OC呢,直接修改Swift文件:



发现这样不行,Swift文件没有找到ViewController这个OC的文件,这个时候桥接头文件就有用处了,修改 TestOC-Bridging-Header.h



再次编译运行,发现没问题了。


2、Swift项目中混编

(1)首先创建一个项目,命名TestSwift,语言选择Swift,不熟悉的可以参考这里

(2)创建好项目后,在项目中添加一个新文件 New File -> Cocoa Class 语言选择OC,命名为FileTest,点击Create后仍然会提示是否创建桥接文件,选择Yes:



下面来说说Swift文件中调用OC:

打开ViewController.swift,添加如下代码

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. import UIKit  
  2.   
  3. class ViewController: UIViewController {  
  4.                               
  5.     override func viewDidLoad() {  
  6.         super.viewDidLoad()  
  7.         // Do any additional setup after loading the view, typically from a nib.  
  8.           
  9.         var test = FileTest()  
  10.     }  
  11.       
  12.     func customFun() {  
  13.     }  
  14.       
  15.     func customFun1() {  
  16.     }  
  17.       
  18.     override func didReceiveMemoryWarning() {  
  19.         super.didReceiveMemoryWarning()  
  20.         // Dispose of any resources that can be recreated.  
  21.     }  
  22. }  

是不是报错啦?



因为OC没有告诉Swift可以访问我哪些内容,很简单,在桥接文件中添加: #import"FileTest.h",告诉Swift,OC中FileTest可以访问:



现在编译运行,没问题了吧!


再来说说OC文件中调用Swift:

在 FileTest.m 中添加代码:

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. #import "FileTest.h"  
  2.   
  3. @implementation FileTest  
  4.   
  5. - (void) test {  
  6.     ViewController *viewCtr = [[ViewController alloc] init];  
  7.     NSLog(@"%@", viewCtr);  
  8. }  
  9.   
  10. @end  

发现报错,找不到ViewController,没关系,缺少头文件,Target -> Build Setting  ->Product Module Name ,修改为MyTest,Target -> Build Setting  ->Defines Module修改成Yes。在FileTest.m中添加 #import "MyTest-Swift.h",现在再编译运行,没问题了吧。

[objc]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. #import "FileTest.h"  
  2. #import "MyTest-Swift.h"  
  3.   
  4. @implementation FileTest  
  5.   
  6. - (void) test {  
  7.     ViewController *viewCtr = [[ViewController alloc] init];  
  8.     NSLog(@"%@", viewCtr);  
  9. }  
  10.   
  11. @end  



点击进入Xcode生成的文件 MyTest-Swift.h ,所有可调用的Swift代码都在这里,包括我们自己写的方法:




如果想使用第三方Framework怎么办?官方文档这么说的:



其实也不难,打开项目配置文件Target -> Build Phases  -> Link Binary With Libraryer,添加你要导入的Framework,如果是第三方的库,可以选择Add Other(我这里选择的是第三方的Framework,也是我自己打包的库):



这样目录结构中可以看到库了:



使用很简单,首先还是要配置下桥接文件,比如我想使用 kalagame-library.framework库中的 KalaGameApi.h 就要这样配置:#import"kalagame-library/KalaGameApi.h"


然后这样调用:  var  test1 =  KalaGameApi (),现在基本的混编知识点就介绍完了。



更多内容见官网文档

由于对官网文档的理解可能不到位,可能对问题的理解有偏差,如果发现错误,还请指正,不胜感激。更多内容请点击这里

Demo下载

欢迎加入群共同学习和进步:QQ群:170549973

本研究利用Sen+MK方法分析了特定区域内的ET(蒸散发)趋势,重点评估了使用遥感数据的ET空间变化。该方法结合了Sen斜率估算器和Mann-Kendall(MK)检验,为评估长期趋势提供了稳健的框架,同时考虑了时间变化和统计显著性。 主要过程结果: 1.ET趋势可视化:研究利用ET数据,通过ET-MK和ET趋势图展示了蒸散发在不同区域的空间和时间变化。这些图通过颜色渐变表示不同的ET水平及其趋势。 2.Mann-Kendall检验:应用MK检验来评估ET趋势的统计显著性。检验结果以二元分类图呈现,标明ET变化的显著性,帮助识别出有显著变化的区域。 3.重分类结果:通过重分类处理,将区域根据ET变化的显著性进行分类,从而聚焦于具有显著变化的区域。这一过程确保分析集中在具有实际意义的发现上。 4.最终输出:最终结果以栅格图和png图的形式呈现,支持各种应用,包括政策规划、水资源管理和土地利用变化分析,这些都是基于详细的时空分析。 ------------------------------------------------------------------- 文件夹构造: data文件夹:原始数据,支持分析的基础数据(MOD16A2H ET数据 宁夏部分)。 results文件夹:分析结果可视化,展示研究成果。 Sen+MK_optimized.py:主分析脚本,适合批量数据处理和自动化分析。 Sen+MK.ipynb:Jupyter Notebook,复现可视化地图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值