• Objective-C调用Swift


    假设已经有了一个老的iOS应用,它是使用Objective-C编写的,而它的一些新功能须要採用Swift来编写,这时就能够从Objective-C调用Swift。

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

    创建Objective-Cproject

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

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


    接着单击“Next”button,随即出现例如以下图所看到的的界面。


    在Product Name中输入“HelloWorld”,在Language中选择Objective-C,其它的项目能够结合自己的实际情况输入内容。相关的project选项设置完毕后,单击“Next”button,后面的步相似。

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


    在Objective-Cproject中加入Swift类

    我们刚刚创建了Objective-C的project,须要加入Swift类到project中。详细过程是,右键选择HelloWorld组,选择菜单中的“New File…”弹出新建文件模板对话框。例如以下图所看到的,选择OS X→Source→Cocoa Class。


    接着单击“Next”button,随即出现如图下所看到的的界面。在Class中输入“SwiftObject”,在Language中选择Swift,其它的选项保持默认值就能够了。


    相关选项设置完毕后,单击“Next”button,进入保存文件界面,依据提示选择存放文件的位置,然后单击“Create”button创建Swift类。假设project中没有桥接头文件,在创建过程中,Xcode也会提示我们是否加入桥接头文件,能够选择不加入。

    调用代码

    Swift的SwiftObject创建完毕后,我们会在Xcodeproject中看到新添加的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对象所必需的,它的命名规则是“<project名>-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课堂微信公共平台



  • 相关阅读:
    利用JQuery+EasyDrag jQuery Plugin实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值 Virus
    批量(导入导出)迁移AD中的用户信息和密码到新环境中,同时保持用户在MOSS中的权限【addusers,ldifde,copypwd,UserInfo,tp_SystemID】 Virus
    修改MOSS网站的URL访问地址 Virus
    MOSS安装目录Layouts中的文件不能用SharePoint Designer修改 Virus
    Office Server 共享服务报错,原因:对路径“c\windows\system32\drivers\ect\hosts”的访问被拒绝 Virus
    微软文档翻译:【最佳实践】使用sharepoint对象模型编程时候的常见问题 Virus
    WCF自定义行为 Step by Step (一)搭建环境
    土了,Silverlight调试一例
    WCF之自定义Channel
    WCF自定义行为 Step by Step (四)第二个自定义behavior
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4009056.html
Copyright © 2020-2023  润新知