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

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数组的使用

    在Swift与Objective-C混合编程时,我们可能需要在NSArray和Swift Array之间转换。这可以通过强制类型转换或使用`NSArray(array:)`和`Array(nsArray:)`构造函数来实现: ```swift let swiftArray: [Int] = [1, 2, 3]...

    NSArray排序demo

    在iOS和Mac开发中,`NSArray`是Foundation框架中的一个核心类,用于存储有序的、不可变的对象集合。本篇文章将深入探讨`NSArray`的排序方法,并通过一个名为"NSArrayDemo"的示例来演示如何对数组进行排序。 首先,...

    OC-NSArray数组的使用Demol

    NSArray可以与NSSet、NSDictionary等其他集合类相互转换。例如,将数组转换为NSSet: ```objc NSSet *set = [NSSet setWithArray:array]; ``` 八、枚举协议 NSArray实现了NSFastEnumeration协议,允许其与其他...

    Iphone数组一些基础操作 NSArray/NSMutableArray

    然后可以使用`arrayWithArray:`方法将一个NSArray转换为NSMutableArray: ```objc NSArray *array = [NSArray arrayWithObjects:@"a",@"b",@"c",nil]; mutableArray = [NSMutableArray arrayWithArray:array]; ``` ...

    NSArray,NSSet,NSEnumerator,NSDictionary及对应Mutable介绍

    这些类包括NSArray、NSSet、NSEnumerator和NSDictionary,以及它们的可变版本NSMutableArray、NSMutableSet和NSMutableDictionary。这些类提供了各种操作来处理对象的集合,如添加、删除、查找等。以下是关于这些类...

    iphone 开发学习基础NSArray

    总之,本教程涵盖了Objective-C中的NSArray基础知识,包括创建和操作固定数组与可变数组,以及如何在类文件中定义和使用它们。通过学习这些内容,初学者将能够更深入地理解和运用Objective-C进行iPhone应用开发。

    oc.zip_NSArray_NSDictionary_去空

    与`NSArray`不同,字典中可以有空值,但通常我们希望避免这种情况。同样,我们需要创建一个新的字典来过滤掉空值键值对: ```objc NSDictionary *originalDict = @{@"key1": @1, @"key2": @"" , @"key3": [NSNull ...

    iOS中NSArray数组常用处理方式

    1. 数组的常用处理方式 //--------------------不可变数组 //1....NSString *s1 = @zhangsan; NSString *s2 = @lisi; NSString *s3 = @wangwu;...NSArray *array1 = [[NSArray ...NSArray *array2 = [NSArray arrayWithOb

    IOS应用源码之Array.rar

    在iOS应用开发中,Array是Objective-C中的一个基础数据结构,它是NSArray类的实例,用于存储和管理有序的对象集合。这个“IOS应用源码之Array.rar”文件很可能包含了一个或多个示例项目,用于演示如何在iOS应用中...

    IOS 开发之 NSMutableArray与NSArray 的区别

    IOS 开发之 NSMutableArray 与 NSArray 的区别 在 IOS 开发中,NSMutableArray 和 NSArray 是两个非常重要的集合类,它们都是 Foundation 框架的一部分。在本文中,我们将详细介绍 NSMutableArray 和 NSArray 的...

    RicdeTmp#TechNote#NSArray、NSDictionary与NSData的相互转换1

    // 方法1:NSKeyedUnarchiver// 方法2:NSJSONSerialization// 方法1:NSKeyedArchiver// 方法2:N

    Reduce:NSArray 类别与集合转换,如reduce、filter 和map

    在Objective-C编程中,`NSArray`是用于存储固定数量对象的集合类,它不支持直接的函数式编程操作,如`reduce`、`filter`和`map`。然而,为了增强`NSArray`的功能,开发者经常通过类别(Category)来扩展其方法。本篇...

    NSArray越界崩溃解决方法

    NSArray是Objective-C中的一个基础数据结构,用于存储和管理有序的对象集合。当尝试访问数组中不存在的索引时,就会发生数组越界(Array Index Out Of Bounds)的问题。在开发过程中,这种错误在debug模式下通常会...

    iOS数组和字典转JSON格式

    在Objective-C中,数组(NSArray)和字典(NSDictionary)与JSON对应。字典是键值对的集合,而数组是有序元素的集合。 要将数组和字典转换为JSON字符串,我们需要使用Foundation框架中的`NSJSONSerialization`类。...

    cydjohn#blogMarkdown#NSArray二维数组的定义1

    NSArray *arr = [[NSArray alloc] initWithObjects:如果要初始化1000项,可以这样:当然换成swift就超级简单了

    Object C 字符串和数组NSString NSArray操作

    Object C 字符串和数组NSString NSArray操作

    SwiftyAs:**SwiftyAs** 是一种像在 Swift 中那样做 `as?` 转换的 Objective-C 方式

    SwiftyAs SwiftyAs是一种 Objective-C 的方式as? 像在 Swift 中一样铸造。 要旨 在 Swift 中,您可以执行...NSArray * array = source.as( NSArray ); // array = nil NSDictionary * dict = source.as( NSDictiona

    Cocoa基本原理指南

    Foundation提供了底层的数据类型和容器类,如NSString、NSArray等;而AppKit则提供了用户界面的构建块,如窗口、按钮和菜单等。此外,Cocoa还支持其他高级功能,如多线程、网络通信和多媒体处理。 ### 三、Cocoa的...

    swift-Array安全工具

    "swift-Array安全工具"正是为了解决这个问题,通过利用Swift的runtime特性,提供了一种方法来增强NSArray和NSMutableArray的安全性,防止因错误操作导致程序崩溃。 首先,我们要理解Swift数组越界的原理。在Swift中...

Global site tag (gtag.js) - Google Analytics