从事iOS开发的童鞋,应该都清楚,通过如下代码,就可以实现NSArray 与 Array 之间的无缝转换:
let mobile = ["iPhone", "Nokia", "小米Note"]
let mobile1 = (mobile as NSArray).objectAtIndex(1)
print(mobile1)
let animalArray = NSArray(objects: "lion", "tiger", "monkey")
var animalCount = (animalArray as Array).count
print(animalCount)
// 输出
// "Nokia"
// ["lion", "tiger", "monkey"]
而且除了数组外,字典( Dictionary )、集合( Set )、字符串( String )也是一样的道理,均可实现无缝转换。
那么问题来了,NSArray 是类类型,而 Array 是结构体类型,一个是引用类型,一个是值类型,它们是怎样实现无缝转换的呢?Cocoa Foundation 与 Core Foundation 之间转换是通过toll-free bridging 技术实现的,那NSArray 与 Array 之间是不是也应该有类似的桥接实现呢?
将鼠标移动到 Array 上,然后 "cmd+鼠标点击" ,进入到 Swift 的声明文件中,在 Array 的注释中,可以看到下面这段代码:
/// Objective-C Bridge
/// ==================
/// The main distinction between Array and the other array types is that it interoperates seamlessly and efficiently with Objective-C.
/// Array<Element> is considered bridged to Objective-C iff Element is bridged to Objective-C.
// ......
可以看出Array 与 Objective-C 的数组之间确实存在有某种桥接技术,我们暂且称之为 "Objective-C Bridge" 桥接。那这又是如何实现的呢?
在当前文件中搜索 bridge ,会发现有这样一个协议: _ObjectiveCBridgeable 。其声明如下:
/// A Swift Array or Dictionary of types conforming to `_ObjectiveCBridgeable` can be passed to Objective-C as an NSArray or NSDictionary, respectively. The elements of the resulting NSArray or NSDictionary will be the result of calling `_bridgeToObjectiveC` on each element of the source container.
public protocol _ObjectiveCBridgeable {
}
即一个 Swift 数组或字典,如果其元素类型实现了 _ObjectiveCBridgeable 协议,则该数组或字典可以被转换成 Objective-C 的数组或字典。对于 _ObjectiveCBridgeable 协议,目前所能得到的文档就只有这些,也看不到它里面声明了什么属性方法。不过,可以看到这个协议是访问控制权限是 public ,也就意味着可以定义类来实现这个接口。
如果大家有兴趣的话,也可以密切关注苹果官方文档,了解更多_ObjectiveCBridgeable 协议相关内容,届时,欢迎大家补充分享。
不管是学习什么知识,不仅要知其然,还要知其所以然。做软件开发,我们如果只知道实现方法,但不知道实现原理,就不能融会贯通,技术进阶道路上也会困难重重。
相关文章:《Objective-C类与Swift结构体的互转》
相关推荐
NSArray排序demo
1. 数组的常用处理方式 //--------------------不可变数组 //1....NSString *s1 = @zhangsan; NSString *s2 = @lisi; NSString *s3 = @wangwu;...NSArray *array1 = [[NSArray ...NSArray *array2 = [NSArray arrayWithOb
官方文档,数组类的最权威文档。各种数组方法的详细说明。英文的。
// 方法1:NSKeyedUnarchiver// 方法2:NSJSONSerialization// 方法1:NSKeyedArchiver// 方法2:N
NSArray *arr = [[NSArray alloc] initWithObjects:如果要初始化1000项,可以这样:当然换成swift就超级简单了
Object C 字符串和数组NSString NSArray操作
SwiftyAs SwiftyAs是一种 Objective-C 的方式as? 像在 Swift 中一样铸造。 要旨 在 Swift 中,您可以执行...NSArray * array = source.as( NSArray ); // array = nil NSDictionary * dict = source.as( NSDictiona
NSArray+Reduce Reduce 是 NSArray 上的 Objective-C 类别,提供有用的数组函数,如reduce 、 filter和map 。
NSString NSArray NSDictionary 方法名释义
比较完美的解决了数组越界的问题, 在debug模式下会崩溃 , 在release不会崩溃 , 开发过程中 , 方便调试 , 正式环境中 减少崩溃.
三、自动转换NSNull值,有时候从服务端传来的是空值,这时会根据你定义的属性类型自动转换为合适的值,比如NSString类型的变成@“”,NSArray的变成@[]等,当然你也可以选择对某些自定的属性阻止这一默认行为 ...
主要介绍了IOS 开发之 NSMutableArray与NSArray 的区别的相关资料,希望通过本文能掌握这部分内容,需要的朋友可以参考下
前言 集合的遍历操作是开发中最常见的操作之一,从C语言经典的for循环到利用多核cpu的优势进行遍历,开发中ios有若干集合遍历方法,本文通过研究和测试比较了各个操作方法的效率和优略势,...NSArray *iosArray = @[@L
Swift-NSArray数组的使用
Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。
Iphone数组一些基础操作 NSArray/NSMutableArrayIphone
OC-NSArray数组的使用Demol
详细的说明和用法 NSArray,NSSet,NSDictionary 以及他们子类的说明
NSPredicate应用,包括以下几个部分: 1、字符串,正则表达式的匹配; 2、字符串数组NSArray和NSMutableArray的快捷过滤方式; 3、自定义对象数组NSArray和NSMutableArray的快捷过滤方式;
- (instancetype)initWithFrame:(CGRect)frame withTitleArray:(NSArray *)array; 协议方法 /** *点击选中协议方法 @param DropView @param index */ - (void)PGGDropView:(PGGDropView *)DropView ...