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

一个元组小技巧

![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的工程

一个元组小技巧 & Swift与OC混编_第1张图片
Honzon.jpg

然后添加一个名为 HonzonOCClass的文件,并加上如下代码

@interface HonzonOCClass : NSObject

+ (void)logHonzonOCClass;

@end


@implementation HonzonOCClass
+ (void)logHonzonOCClass {
    NSLog(@"HonzonOCClass");
}
@end

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

一个元组小技巧 & Swift与OC混编_第2张图片
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可以看到

一个元组小技巧 & Swift与OC混编_第3张图片
Old_Swift Complier - Code Genneration.jpg

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

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

#import"HonzonOCClass.h"

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

一个元组小技巧 & Swift与OC混编_第4张图片
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混编)