美文网首页Swift
一个元组小技巧 & Swift与OC混编

一个元组小技巧 & Swift与OC混编

作者: honzon_0 | 来源:发表于2016-03-10 17:16 被阅读255次

    一个元组小技巧

    ![Uploading Honzon_045208.jpg . . .]#元组小拓展用法
    Swift 元组高级用法和最佳实践提到了元组做为匿名结构体以及对于 Swift 的编译器而言,方法/函数的参数头无非就是一个元组之后的示例,联想到的元组用法

    struct User {
        let name: String
        let age: Int
    }
    //vs.
    let user = (name: "Carl", age: 40)
    let newUser = User(user)
    print("new User name:", newUser.name, "age:", newUser.age)
    
    class Person {
        let name: String
        let age: Int
        init(name: String, age: Int) {
            self.name = name
            self.age = age
        }
    }
    
    let person = Person(user)
    print("person name:", person.name, "age:", person.age)
    

    打印结果

    new User name: Carl age: 40
    person name: Carl age: 40
    

    Swift 元组高级用法和最佳实践同样也列举了一些相似的示例,我就不引用了,但是结论这种方式包含了很多有趣的含义和可能性。如果对类型进行很好的规划,你甚至可以不需要对数据进行解构,然后直接把它们当作参数在函数间传递。更妙的是,对于函数式编程,你可以直接返回一个含多个参数的元组到一个函数中,而不需要对它进行解构。

    参考地址:

    Swift 元组高级用法和最佳实践

    Swift与OC混编

    Swift中使用OC

    首先Swift中不再使用头文件和.m文件的方式了。所以也不需要使用import "***.h"的方式来导入头文件。但是,swift是需要使用头文件进行访问的,只是不需要使用显式的方式使用import进行导入。有两种方式来实现这个头文件的生成。

    创建一个名为Honzon的工程

    Honzon.jpg
    然后添加一个名为HonzonOCClass的文件,并加上如下代码
    @interface HonzonOCClass : NSObject
    
    + (void)logHonzonOCClass;
    
    @end
    
    
    @implementation HonzonOCClass
    + (void)logHonzonOCClass {
        NSLog(@"HonzonOCClass");
    }
    @end
    

    方式一:利用第一次新建提示的方式自动添加桥接头文件

    Create_Bridging_Header.jpg

    ![](/Users/liuqiangdouble/Desktop/Swift 觅仙之路/Swift开光/Images/Create_Bridging_Header.jpg)

    然后在桥接文件中导入文件

    #import"HonzonOCClass.h"
    

    那么在main.swift文件中就可以调用OC中的类方法了

    HonzonOCClass.logHonzonOCClass()
    

    打印结果

    2016-03-10 15:45:07.131 Honzon[1728:171772] HonzonOCClass
    

    方式二:自定义桥接头文件

    我们在targets->build settings -> Swift Complier - Code Genneration ->Object-C Bridging Header可以看到

    Old_Swift Complier - Code Genneration.jpg

    在这里可以设置为自定义桥接的头文件

    那么,创建一个名为HonzonHeader.h的文件并且导入头文件

    #import"HonzonOCClass.h"
    

    然后修改targets->build settings -> Swift Complier - Code Genneration ->Object-C Bridging Header的桥接头文件为HonzonHeader.h

    New_Swift Complier - Code Genneration.jpg
    打印结果:
    2016-03-10 16:18:36.962 Honzon[1845:189561] HonzonOCClass
    

    OC中使用Swift

    选中targets->build settings ->packing->Product Module Name中设置模块名,这个名称很重要 swift 的头文件就是根据这个来命名的。
    targets->build settings ->packing->Product Module Name修改为HonzonModule,然后在 添加一个名为HonzonSwiftClassswift文件,该代码如下:

    class HonzonSwiftClass: NSObject {
        class func logHonzonSwiftClassMessage() {
            print("logHonzonSwiftClassMessage")
        }
    }
    
    

    然后在HonzonOCClass.m导入HonzonModule-swift.h文件

    点击进入HonzonModule-swift.h是这个样子的

    SWIFT_CLASS("_TtC12HonzonModule16HonzonSwiftClass")
    @interface HonzonSwiftClass : NSObject
    + (void)logHonzonSwiftClassMessage;
    - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
    @end
    

    HonzonOCClass.m具体代码如下

    #import "HonzonOCClass.h"
    #import "HonzonModule-swift.h"
    @implementation HonzonOCClass
    + (void)logHonzonOCClass {
        [HonzonSwiftClass logHonzonSwiftClassMessage];
        NSLog(@"HonzonOCClass");
    }
    @end
    

    打印结果如下:

    logHonzonSwiftClassMessage
    2016-03-10 16:41:41.088 Honzon[1914:199668] HonzonOCClass
    

    总结:

    工程中如果Swift需要OC中的类,只需要在桥接文件中到如需要的OC头文件即可;而在OC中需要Swift的类(如果在Swift中的类不是继承自NSObject或者派生自NSobject, 那么不会生成相应的转换类),直接导入***-swift.h就可以了,其中***Product Module Name对应的值。

    参考地址:

    初探swift语言的学习笔记九(OC与Swift混编)

    因为学习Swift时间并不长,所以某些地方可能有误,如果发现,请及时告知。

    本文为原创文章,未经本人同意,禁止转载

    相关文章

      网友评论

        本文标题:一个元组小技巧 & Swift与OC混编

        本文链接:https://www.haomeiwen.com/subject/rhmtlttx.html