Objective-C调用Swift

news/2024/7/20 22:17:17 标签: ios, 游戏, swift, 手机游戏

如果已经有了一个老的iOS应用,它是使用Objective-C编写的,而它的一些新功能需要采用Swift来编写,这时就可以从Objective-C调用Swift。

Objective-C调用Swift时不需要桥接头文件,而是需要Xcode生成的头文件。这种文件由Xcode生成,不需要我们维护,对于开发人员也是不可见的。如下图所示,它能够将Swift中的类暴露给Objective-C,它的命名是:<工程名>-swift.h。我们需要将该头文件引入到Objective-C文件中,而且Swift中的类需要声明为@objc。

创建Objective-C工程

为了能够更好地介绍混合搭配调用,我们首先创建一个Objective-C工程。出于简单考虑,我们可以创建一个Mac OS X命令行工程。

启动Xcode 6,然后单击File→New→Project菜单,在打开的Choose atemplate for your new project界面中选择“OS X→Application→Command Line Tool”工程模板(如下图所示)。


接着单击“Next”按钮,随即出现如下图所示的界面。


在Product Name中输入“HelloWorld”,在Language中选择Objective-C,其他的项目可以结合自己的实际情况输入内容。相关的工程选项设置完成后,单击“Next”按钮,后面的步类似。

创建成功后的界面如下图所示,在左边的导航栏中生成了一个main.m文件。打开main.m文件,可以在右边的代码界面中看到它的代码,我们还可以在这里编写代码。


在Objective-C工程中添加Swift类

我们刚刚创建了Objective-C的工程,需要添加Swift类到工程中。具体过程是,右键选择HelloWorld组,选择菜单中的“New File…”弹出新建文件模板对话框。如下图所示,选择OS X→Source→Cocoa Class。


接着单击“Next”按钮,随即出现如图下所示的界面。在Class中输入“SwiftObject”,在Language中选择Swift,其他的选项保持默认值就可以了。


相关选项设置完成后,单击“Next”按钮,进入保存文件界面,根据提示选择存放文件的位置,然后单击“Create”按钮创建Swift类。如果工程中没有桥接头文件,在创建过程中,Xcode也会提示我们是否添加桥接头文件,可以选择不添加。

调用代码

Swift的SwiftObject创建完成后,我们会在Xcode工程中看到新增加的SwiftObject.swift文件。

SwiftObject.swift代码如下:

 

import Foundation                                                               ①
 
@objc class SwiftObject: NSObject {                     ②
 
Func sayHello(greeting : String, withName name : String) ->String {      ③
 
var string = "Hi," + name
string += greeting
 
return string;
    }
}

上述代码第①行引入了Foundation框架的头文件。第②行代码定义SwiftObject类,SwiftObject类继承自NSObject类。另外,我们在类前面声明为@objc,@objc所声明的类能够被Objective-C访问,@objc还可以修饰属性。

第③行代码定义了sayHello方法,它有两个参数,第一个参数不需要指定外部参数名,第二个参数(除了第一个以后所有的参数)需要指定外部参数名,例如withName是name参数的外部参数名。这是为了方便在Objective-C中调用。

下面看Objective-C端的代码,main.m文件代码如下:

#import <Foundation/Foundation.h>
#import "HelloWorld-swift.h"                            ①
 
int main(intargc, const char * argv[]) {
 
SwiftObject *sobj = [[SwiftObjectalloc] init];          ②
NSString *hello = [sobjsayHello:@"Good morning"withName:@"Tony"];        ③
 
NSLog(@"%@",hello);                                                         ④
 
return 0;
}

 上述代码第①行引入头文件HelloWorld-swift.h,它是Objective-C调用Swift对象所必需的,它的命名规则是“<工程名>-swift.h”。

第②行代码实例化SwiftObject对象,SwiftObject是Swift中定义的类。第③行代码调用SwiftObject的sayHello方法,它在Objective-C中被调用时的方法和参数命名与SwiftObject的方法和参数之间的对应关系如下图所示。

 


第④行代码NSLog(@"%@",hello)用于输出结果,输出结果如下:

2014-07-05 14:25:43.879HelloWorld[3266:303] Hi,TonyGood morning

这样就实现了在Objective-C中调用Swift代码,我们可以借助于这样的调用充分利用已有的Swift文件,减少重复编写代码,提高工作效率。


更多内容请关注国内第一本Swift图书 《Swift开发指南》
本书交流讨论网站: http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

欢迎关注智捷iOS课堂微信公共平台




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

相关文章

功能:编写函数fun求s=1^k+2^k +3^k + ......+N^k的值, (1的K次方到N的K次方的累加和)。

题目&#xff1a; 代码详解&#xff1a; #define K 4 #define N 5 #include <stdio.h>long fun(int n, int k) {/**********Program**********/long sum 1,i,j,t;for (i 2; i < n; i){t 1;for (j 1; j < k; j){t * i;}sum t;}return sum;/********** End …

React+fetch通过修改配置文件解决跨域问题

fetch("http://tingapi.ting.baidu.com/v1/restserver/ting?methodbaidu.ting.billboard.billList&type1&size10&offset0", { }).then(res > res.json()).then(res > {console.log(res);});这是一个会发生跨域的请求地址 我们可以通过修改配置文…

elementUi表格通过v-if控制列展示发生字段错位解决方法

可以做个双重保障 给el-table-column设置唯一的key值 <el-table-columnproperty"currentAuditorNames"v-if"checkArray(describe)"label"当前审核人"key"1"align"center" > </el-table-column> <el-table-c…

功能:将主函数中输入的字符串反序存放。例如:输入字符串“abcdefg”,则应输出“gfedcba”。

题目&#xff1a; 代码详解&#xff1a; #include <stdio.h> #include <conio.h> #include <string.h> #define N 81void fun(char* str, int n) {/**********Program**********/int i,t;for (i 0; i < n/2;i) {t str[i];str[i] str[n - i - 1];st…

Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课

Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课 本课程采用QQ群直播方式进行直播&#xff0c;价值99元视频课程免费直播。完整的基于Swift项目实战&#xff0c;手把手教你做一个Swift版iPhone计算器。&#xff08;直播过程也有惊喜&#xff01;&#xff09;直…

功能:求5行5列矩阵的主、副对角线上元素之和。注意, 两条对角线相交的元素只加一次。例如:主函数中给出的矩阵的两条对角线的和为45。

题目&#xff1a; 代码详解&#xff1a; #include <stdio.h> #define M 5int fun(int a[M][M]) {/**********Program**********/int i, j, sum 0;for (i 0; i < M; i){sum a[i][i];sum a[i][M - i - 1];}if (M & 1) sum - a[M / 2][M / 2];return sum;/****…

java.io.InvalidClassException: made.customException; local class incompatible: stream classdesc seri

我们使用对象序列化和反序列化时 容易出现这个问题 这个异常捅错有三种情况可以触发 第一种情况 该类没有无参的构造方法 如果是这个情况 直接在类里定义一个无参的构造方法即可 第二种 该类包含未知的数据类型 这个只需要注意一下 类里面的代码和数据定义就好了 第三种 也是…

关于《Swift开发指南》背后的那些事

时间轴&#xff08;倒叙&#xff09;2014年8月底在图灵出版社的大力支持下&#xff0c;全球第一本全面、系统、科学的&#xff0c;包含本人多年经验的呕心沥血之作《Swift开发指南》&#xff08;配有同步视频课程和同步练习&#xff09;全线重磅推出2014年7月5日苹果宣布Swift语…