• Swift调用Objective-C


    Swift调用Objective-C需要一个名为“<工程名>-Bridging-Header.h”的桥接头文件,如下图所示。桥接头文件的作用是为Swift调用Objective-C对象搭建一个桥,它的命名必须是“<工程名>- Bridging-Header.h”,我们需要在桥接头文件中引入Objective-C头文件,而且桥接头文件是需要管理和维护的。

     

    创建Swift工程
    为了能够更好地介绍混合搭配调用,我们首先创建一个Swift工程。出于简单考虑,我们可以创建一个Mac OS X命令行工程,而不是一个iOS工程。
    启动Xcode 6,然后单击File→New→Project菜单,在打开的Choose a template for your new project界面中选择“OS X→Application→Command Line Tool”工程模板

     

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

     

    我们可以按照提示并结合自己的实际情况和需要输入相关内容。下面简要说明一下图18-3中的工程选项。
    Product Name:工程名。
    Organization Name:组织名。
    Organization Identifier:组织标识(很重要)。一般情况下,这里输入的是组织名或公司的域名(如net.cocoagame),类似于Java中的包命名。
    Bundle Identifier:捆绑标识符(很重要)。该标识符由Product Name + Organization Identifier构成。因为在App Store上发布应用的时候会用到它,所以它的命名不可重复。
    Language:开发语言选择。在这里我们可以选择开发应用所使用的语言,在Xcode 6中可以选择Swift和Objective-C。
    相关工程选项设置完成后,单击“Next”按钮,进入下一级界面。根据提示选择存放文件的位置,然后单击“Create”按钮,出现如下图所示的界面。

     

    在左边的导航栏中打开main.swift文件,会看到如下图所示的代码界面,我们可以在这里编写Swift代码。

     

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

     

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

     

    相关选项设置完成后,单击“Next”按钮,进入保存文件界面,根据提示选择存放文件的位置,然后单击“Create”按钮创建Objective-C类。如果是第一次创建Objective-C类,那么保存完成的时候,Xcode会提示我们是否添加桥接头文件,如下图所示,弹出一个对话框,我们应该选择“Yes”,之后会在工程中创建桥接头文件HelloWorld-Bridging-Header.h。

     

    调用代码
    Objective-C的ObjCObject创建完成后,我们会在Xcode工程中看到新增加的两个文件ObjCObject.h和ObjCObject.m。本书并不打算过多地介绍Objective-C语言,但为了更好地理解Swift与Objective-C的互相调用,我们还是简单地解释一下Objective-C代码。
    ObjCObject.h代码如下:
    #import <Foundation/Foundation.h> ①


    @interface ObjCObject : NSObject ②


    -(NSString*)sayHello:(NSString*)greeting withName: (NSString*)name; ③


    @end
    ObjCObject.h文件是Objective-C的头文件,我们在这里定义类,声明类的成员变量和方法。第①行代码引入Foundation框架的头文件。第②行代码定义类ObjCObject,它继承自NSObject父类。NSObject类是所有Objective-C的根类。第③行代码声明了实例方法sayHello: withName:,它有两个参数greeting和name。
    ObjCObject.m代码如下:
    #import "ObjCObject.h" ①


    @implementation ObjCObject


    -(NSString*)sayHello:(NSString*)greeting withName: (NSString*)name ②
    {
    NSString *string = [NSStringstringWithFormat:@"Hi,%@ %@.",name,greeting];
    return string;
    }


    @end
    上述代码第①行引入ObjCObject.h头文件,第②行代码定义sayHello: withName:方法。
    下面我们再来看看Swift调用文件main.swift的代码:
    import Foundation ①


    varobj : ObjCObject = ObjCObject() ②
    var hello = obj.sayHello("Good morning", withName:"Tony") ③


    println(hello) ④
    上述代码第①行的import Foundation语句是引入Foundation框架,类似于Objective-C的#import <Foundation/Foundation.h>语句,关于Foundation框架我们会在下一章介绍。
    第②行代码声明并实例化ObjCObject类的实例obj。ObjCObject就是Objective-C里定义的ObjCObject。
    第③行代码调用ObjCObject类的sayHello: withName:方法。要注意Swift调用时的方法名和参数与Objective-C中该方法的方法名和参数的对应关系,如下图所示。
     
    第④行代码打印输出结果,输出结果如下:
    Hi,Tony Good morning.
    要使Swift能够调用Objective-C,还必须在桥接头文件中引入Objective-C头文件。HelloWorld- Bridging-Header.h代码如下:
    #import "ObjCObject.h"
    很简单,只有一行代码,如果还有其他的Objective-C头文件,都需要在此引入。
    这样就实现了在Swift中调用Objective-C代码,我们可以借助于这样的调用充分地利用已有的Objective-C文件,减少重复编写代码,提供工作效率。
    至此,整个工程创建完毕。如图所示,点击左上角的“运行”按钮 即可查看运行结果。
     

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

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

  • 相关阅读:
    @RequestParam,@PathParam,@PathVariable,@QueryParam注解的使用区别
    关于android studio 出现Error:Execution failed for task ':app:preDebugAndroidTestBuild'. 的解决办法
    opencv:轮廓匹配
    opencv:图像轮廓计算
    opencv:图像轮廓发现
    opencv:联通组件扫描
    opencv:自适应阈值
    opencv:全局阈值
    opencv:二值图像的概念
    opencv:边缘提取
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/3914873.html
Copyright © 2020-2023  润新知