`
小麦麦子
  • 浏览: 31902 次
文章分类
社区版块
存档分类
最新评论

NSArray类 与 Array结构体的转换原理是什么?

阅读更多

 

       从事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结构体的互转

 

分享到:
评论

相关推荐

    Swift-NSArray数组的使用

    总之,虽然NSArray在Objective-C中占有重要地位,但在Swift中,我们通常推荐使用Swift的Array结构体,除非有与Objective-C代码交互的特定需求。理解并熟练掌握Swift中的NSArray使用,可以帮助开发者更好地应对跨语言...

    iOS-面试宝典3.0.pdf

    其中`NSJSONSerialization`是苹果官方推荐的方式,可以方便地将JSON数据转换成NSDictionay或NSArray对象。 #### 八、自动释放池底层怎么实现 自动释放池(`NSAutoreleasePool`)是一个特殊的对象,用于收集和管理...

    ARC完全指南

    - 使用`bridged`属性,例如`NSArray`可以转换为`NSArray *array = [NSArray arrayWithObjects:(id)[@1, @2, @3]];` ### Delegate与弱引用 - **场景**:在delegate模式中,通常需要使用弱引用以避免循环引用问题。...

    object c语法总结

    Objective-C引入了面向对象的概念,如类、对象、继承等,并与C语言兼容,使得开发者能够轻松地混合使用C语言的特性。 - **Cocoa**:Cocoa框架是苹果为Mac OS X和iOS提供的应用程序开发框架。它提供了一系列预定义的...

    swift中AnyObject和Any的介绍与区别详解

    这样的转换会导致Swift类型变为其桥接的Objective-C类型,如`Array`变成`NSArray`,`String`变成`NSString`。 另一方面,如果你想要保持Swift原生类型,可以使用`Any`来代替`AnyObject`: ```swift var array: ...

    cococa图表算法

    由于 `NSRect`、`NSPoint` 和 `NSSize` 都不是对象类型,因此不能直接将它们存储在 `NSArray`、`NSDictionary` 或 `NSSet` 中。但可以通过 `NSValue` 对象来包装这些结构体,并进行存储和检索。 示例代码如下: ``...

    ios 获取通讯录的代码

    在Objective-C中,我们可以创建一个自定义模型类,如`PersonModel`,然后将信息转换并存入数组: ```objc NSMutableArray *peopleArray = [NSMutableArray array]; for (ABRecordRef person in allPeople) { ...

    iOS:demo 小功能 OC实现常用数据结构

    在OC中,可以使用结构体或类来表示链表节点,注意处理好内存管理问题,避免内存泄漏。 5. 队列(Queue): OC中可以使用NSOperationQueue实现并发操作的队列。NSOperationQueue提供了串行和并行执行任务的能力,...

Global site tag (gtag.js) - Google Analytics