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

news/2024/9/5 19:10:38 标签: swift, 移动开发, xcode

一、概要

首先看《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 中的代码:

import Foundation

@objc(FileTest)
class FileTest: NSObject {
    @objc(initWithData:)
    init (data: String) {
        println(data)
    }
}

这里看到了 @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。加入例如以下代码

import UIKit

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

是不是报错啦?



由于OC没有告诉Swift能够訪问我哪些内容,非常easy。在桥接文件里加入: #import"FileTest.h"。告诉Swift,OC中FileTest能够訪问:



如今编译执行,没问题了吧!


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

在 FileTest.m 中加入代码:

#import "FileTest.h"

@implementation FileTest

- (void) test {
    ViewController *viewCtr = [[ViewController alloc] init];
    NSLog(@"%@", viewCtr);
}

@end

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

#import "FileTest.h"
#import "MyTest-Swift.h"

@implementation FileTest

- (void) test {
    ViewController *viewCtr = [[ViewController alloc] init];
    NSLog(@"%@", viewCtr);
}

@end



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




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



事实上也不难,打开项目配置文件Target -> Build Phases  -> Link Binary With Libraryer,加入你要导入的Framework,假设是第三方的库,能够选择Add Other(我这里选择的是第三方的Framework,也是我自己打包的库):



这样文件夹结构中能够看到库了:



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


然后这样调用:  var test1 = KalaGameApi (),如今主要的混编知识点就介绍完了。



很多其它内容见官网文档

因为对官网文档的理解可能不到位。可能对问题的理解有偏差,假设发现错误。还请指正。不胜感激。很多其它内容请点击这里

Demo下载

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


转载于:https://www.cnblogs.com/claireyuancy/p/6970559.html


http://www.niftyadmin.cn/n/1061442.html

相关文章

CodeForces468B Two Sets 解题报告

题目要求把整数集P的元素分成两部分A与B,A集要求若x在其中,则a-x也必须在其中,B集要求若x在其中,则b-x也必须在其中。这个问题可以建模成一个二分图的完美匹配问题。二分图的左右两个点集都是P,将x与a-x(若…

linux wifi自动消失,linux没有wifi

layout: defaulttitle: linux没有wificategory: [技术, 安全]comments: true---linux的wifi出现问题的介绍几次重装linux系统,经常出现没有wifi的状况错误详情之前安装过CentOS,Kylin,OpenSU,等等经常出现没有wifi的状况,虽说猜测是遇到驱动问题,但是一直没有花时间去尝试解决.…

维翔主机asp主机使用遇到的问题及解决方案总结

1.数据库配置 在这里,我们会发现,红色圈起来的部分"Webadmin"处点击之后会报错,这是因为,数据库管理工具没有进行域名解析,需要在域名购买商处添加一个域名解析,mssql,ip为网站的ip地…

map()

map()原型是:map(function,sequence),就是对序列sequence中每个元素都执行函数function操作 得到每行只和: >>> list [[0,1,2],[3,1,4]] >>> [sum(x) for x in list] [3, 8] >>> map(sum,list) [3, 8]如果要…

文明5美丽新世界神系信条作用及评价

文明5美丽新世界的发布给玩家带来了全新的游戏体验,这部资料片对游戏设定做了不少改变,而且让玩家用更加文明的方式来处理游戏战争问题,下面是美丽新世界神系信条作用及评价详解。 神系信条作用及评价 神系信条,即积累信仰到一定数…

微信公众号的搭建-第四天(2)-获取并缓存access_token

1. 什么是access_token? 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口、客服接口、获取用户信息接口、用户分组接口、群发接口等, 开发者在调用这些接口时&#xf…

linux ssh 十进制转字符,linux ssh key的转换

我们在使用linux主机的时候一般生产key有两种形式,一种是在linux主机上面生成,然后将私钥分发出去,还有一种是用ssh工具生成然后将公钥上传至服务器。下面三种情况需要key的转换。原创博文来自:www.51niux.com 博主:忙…

MBProgressHUD长时间加载无法取消的解决方法

使用MBProgressHUD时&#xff0c;加载网路数据&#xff0c;或者等待webview加载完毕&#xff0c;长时间的等待导致体验不佳&#xff0c;这时候希望点击屏幕取消加载动画效果&#xff1b; // MBProgressHUD.hprotocol MBProgressHUDDelegate <NSObject>optional/** * Cal…