`

Objective-C调用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代码如下:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. import Foundation                                                               ①  
  2.    
  3. @objc class SwiftObject: NSObject {                     ②  
  4.    
  5. Func sayHello(greeting : String, withName name : String) ->String {      ③  
  6.    
  7. var string = "Hi," + name  
  8. string += greeting  
  9.    
  10. return string;  
  11.     }  
  12. }  

 

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

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

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

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. #import <Foundation/Foundation.h>  
  2. #import "HelloWorld-swift.h"                            ①  
  3.    
  4. int main(intargc, const char * argv[]) {  
  5.    
  6. SwiftObject *sobj = [[SwiftObjectalloc] init];          ②  
  7. NSString *hello = [sobjsayHello:@"Good morning"withName:@"Tony"];        ③  
  8.    
  9. NSLog(@"%@",hello);                                                         ④  
  10.    
  11. return 0;  
  12. }  

 

 

 上述代码第①行引入头文件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课堂微信公共平台

分享到:
评论

相关推荐

    Swift的使用,Using Swift with Cocoa and Objective-C(Swift4.0.3)

    同时,Swift支持Objective-C的消息传递机制,使得两种语言之间的调用变得自然。 2. **类型安全**:Swift强调类型安全,这在与Objective-C交互时尤为重要。Swift会自动推断类型,但有时需要显式指定,以确保与其他...

    Swift和Objective-C混合编程示例代码

    通过这个示例代码,你可以学习如何设置项目结构,创建桥接头文件,以及在Swift和Objective-C之间编写和调用方法。同时,了解上述知识点将有助于你在实际开发中更好地管理和整合这两种语言,提升代码质量和效率。通过...

    object-c调用swift的最佳简单实践附件

    本文将详细探讨如何在Objective-C中有效地调用Swift代码,实现最佳实践。 首先,我们需要确保Xcode版本支持混编,因为Swift与OC的互操作性是在Xcode 6引入的。在创建项目时,可以选择“Use Swift with Objective-C...

    Using-Swift-with-Cocoa-and-Objective-C(4.1)

    - **语法差异**:Swift拥有更简洁、现代化的语法,而Objective-C则显得更为繁琐,例如方法调用使用`-`和`+`符号。 - **类型安全**:Swift是静态类型语言,强制类型检查,而Objective-C是动态类型语言,运行时确定...

    Objective-C的语法与Cocoa框架.pdf

    Objective-C语法的基石是C语言的语法结构,这意味着所有的C语言代码都可以在Objective-C中直接使用。但是,Objective-C在C的基础上新增了消息传递机制,这是它与C语言的一个重要区别。在Objective-C中,方法调用是...

    Runtime Code Injection for Objective-C & Swift.zip

    《Objective-C与Swift运行时代码注入详解》 在iOS应用开发中,Objective-C与Swift的运行时特性为我们提供了丰富的可能性,其中之一就是运行时代码注入。本文将深入探讨这个主题,帮助开发者理解如何利用这一技术来...

    Objective-C.2.0 中文版.pdf & Objective-C.chm

    Objective-C是一种强大的面向对象编程语言,特别是在iOS和macOS...了解并熟练掌握Objective-C是成为苹果平台开发者的关键步骤,因为虽然Swift已经越来越流行,但Objective-C在很多现有的代码库和框架中仍然被广泛使用。

    Programming With Objective-C

    根据给出的内容,我们可以总结出以下关于Objective-C编程语言的知识点,这些知识点将覆盖从Objective-C的基础知识到高级特性,以及如何在iOS移动开发中使用Objective-C: 1. Objective-C简介 Objective-C是一种面向...

    objective-c基础教程

    Objective-C是iOS开发中最主要的编程语言之一,在苹果推出Swift之前,几乎所有iOS应用程序都是用Objective-C编写的。虽然现在Swift已经成为苹果官方推荐的首选语言,但许多现有应用仍基于Objective-C编写,且该语言...

    swift-Promises一个为Objective-C和Swift提供同步构造的现代框架

    Swift Promises是一个强大的工具,它为Objective-C和Swift开发者提供了处理异步操作的现代解决方案。在iOS、macOS以及其他的Apple平台开发中,异步编程是必不可少的,尤其是在网络请求、文件读写、多线程交互等场景...

    Objective-C

    Objective-C是在C语言的基础上扩展了Smalltalk式的面向对象特性,使得它既有C语言的强大功能,又具备了面向对象编程的灵活性。 在Objective-C中,类是所有对象的基础。类定义了一组属性(实例变量)和方法(函数)...

    Objective-C程序设计 第6版.pdf

    第6版更新了现代Swift编程语言的背景知识,帮助读者理解Objective-C与Swift之间的异同,使他们能够更好地在两者之间切换。 1. **基础语法**:Objective-C的基础始于C语言,包括变量、数据类型、控制结构(如if语句...

    Objective-C基础教程源代码 Learn objective-C on the Mac Mark Dalrymple著书

    熟悉它的项目管理、调试工具、Interface Builder以及Swift和Objective-C的混合编程是必要的。 通过《Learn Objective-C on the Mac》的源代码,读者可以实践上述概念,加深理解。"Knaster Source Code"可能包含书中...

    Objective-C 编程语言.pdf

    Objective-C的语法结构主要包括类定义、方法声明和调用、属性声明、协议和代理等。例如,一个简单的类定义可能如下所示: ```objective-c @interface Person : NSObject @property (nonatomic, strong) NSString *...

    ObjectC & Swift

    **一、Objective-C调用Swift** 1. **设置桥接头文件**: 在Objective-C项目中引入Swift代码,首先需要创建一个桥接头文件(通常命名为`ProjectName-Bridging-Header.h`)。这个文件允许Objective-C代码访问Swift中的...

    iOS和OSXAutoLayout的终极API—简单,强大_Objective-C和Swift兼容v.zip

    这个压缩包"iOS和OSXAutoLayout的终极API—简单,强大_Objective-C和Swift兼容v.zip"包含了一个名为"PureLayout-master"的项目,该项目可能是PureLayout库的一个版本,这是一个开源的AutoLayout框架,旨在简化...

    Objective-C程序设计

    Swift的出现虽然在一定程度上替代了Objective-C,但对于现有的大量Objective-C代码库和深厚的技术积累,Objective-C仍然在iOS和macOS开发中占有重要地位。 总之,Objective-C程序设计涵盖了面向对象编程的基本概念...

    The Objective-C Programming Language

    4. **兼容C语言**:Objective-C与C语言完全兼容,可以直接在Objective-C代码中调用C语言的函数。 5. **内存管理**:Objective-C提供了一套内存管理规则(称为引用计数),用于控制对象的生命周期。 #### 四、...

Global site tag (gtag.js) - Google Analytics