从数组末尾切片 NSArray

2024-03-21

“切片”的最佳方法是什么NSArray从数组的末尾而不是开头开始(例如,查找包含 a 的最后几个元素的子数组)NSArray长度未知)?在 Python 中,您可以使用负索引来完成此操作,例如:

new_list = old_list[-5:-3]

在 Objective-C 中执行此操作最自然的方法是什么?


没有什么可以与 Python 的良好语法相匹配,但你可以这样做:

NSUInteger count = [myArray count];
NSArray * slice = [myArray subarrayWithRange:(NSRange){count-n, n}];

您还可以为以下内容编写一个类别NSArray, 就像是:

@interface NSArray (jrdioko_slice)
- (NSArray *) jrdioko_sliceFrom:(NSInteger)start to:(NSInteger)stop;
@end

如果你想走这条路,Python源码肯定会值得学习。 A列表对象 http://svn.python.org/view/%2acheckout%2a/python/tags/r265/Objects/listobject.c?content-type=text%2Fplain创建一个切片对象 http://svn.python.org/view/%2acheckout%2a/python/tags/r265/Objects/sliceobject.c?content-type=text%2Fplain当执行切片操作时。切片对象的相关方法是PySlice_GetIndicesEx。你只需要小心地将这些索引变成NSRange。正如该函数中的评论所警告的那样“这比您想象的更难做到正确”。 (稍后我会尝试解决这个问题。)

更新:这里我们有一个切片类别NSArray。索引计算逻辑几乎直接来自我上面链接的 Python 代码。*如果您不必担心 Python 切片的步幅部分,它实际上比我一开始想象的要容易得多。我已经通过一些测试运行了它,它的工作原理似乎与 Python 版本相同。

@interface NSArray (WSS_Slice)
- (NSArray *)WSS_arrayBySlicingFrom:(NSInteger)start to:(NSInteger)stop;
@end

// Python allows skipping any of the indexes of a slice and supplies default
// values. Skipping an argument to a method is not possible, so (ab)use 
// NSNotFound as "not specified" index value. The other way to do this would
// be with varargs, which might be even handier if one decided to implement
// the stride functionality.
enum {
    WSS_SliceNoIndex = NSNotFound
};

@implementation NSArray (WSS_Slice)

- (NSArray *)WSS_arrayBySlicingFrom:(NSInteger)start to:(NSInteger)stop {
    // There's an important caveat here: specifying the parameters as 
    // NSInteger allows negative indexes, but limits the method's 
    // (theoretical) use: the maximum size of an NSArray is NSUIntegerMax, 
    // which is quite a bit larger than NSIntegerMax. 
    NSUInteger count = [self count];

    // Due to this caveat, bail if the array is too big.
    if( count >= NSIntegerMax ) return nil;

    // Define default start and stop
    NSInteger defaultStart = 0;
    NSInteger defaultStop = count;

    // Set start to default if not specified
    if( start == WSS_SliceNoIndex ){
        start = defaultStart;
    }
    else {
        // If start is negative, change it to the correct positive index.
        if( start < 0 ) start += count;
        // Correct for out-of-bounds index:
        // If it's _still_ negative, set it to 0
        if( start < 0 ) start = 0;
        // If it's past the end, set it to just include the last item
        if( start > count ) start = count;
    }

    // Perform all the same calculations on stop
    if( stop == WSS_SliceNoIndex ){
        stop = defaultStop;
    }
    else {
        if( stop < 0 ) stop += count;
        if( stop < 0 ) stop = 0;
        if( stop > count ) stop = count;
    }

    // Calculate slice length with corrected indexes
    NSInteger sliceLength = stop - start;

    // If no slice, return a new empty array
    if( sliceLength <= 0 ){
        return [NSArray array];
    }
    else {
        return [self subarrayWithRange:(NSRange){start, sliceLength}];
    }

}
@end

*Therefore I think I need to include a link to the Python License http://docs.python.org/release/2.6.5/license and also note that this may still be “Copyright © 2001-2010 Python Software Foundation; All Rights Reserved”, because although this looks to me like a separately-copyrightable derivative work, I ain't a lawyer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从数组末尾切片 NSArray 的相关文章

  • 尝试将 indexPath 保存到 NSUserDefaults 时出错

    我试图保存 UICollectionView 的索引路径 但出现以下错误 libc abi dylib terminating with uncaught exception of type NSException 我的代码是 保存索引路径
  • 去除iOS输入阴影

    在 iOS Safari 5 上 我必须遵循输入元素 顶部内部阴影 我想删除顶部阴影 错误 webkit appearance不保存 目前的风格是 input border radius 15px border 1px dashed BBB
  • iPhone中的异步for循环

    for循环看起来像这样 我在视图中编写的确实加载了 因此加载此页面需要更多时间 for int i 3 i lt dataDict objectForKey rss objectForKey channel objectForKey ite
  • 更新到 SDK 1.3.1 后未捕获 GMSMapView 上的拖动/平移手势

    我在通过手势识别器捕获 GMSMapView 上的拖动 平移手势时遇到了一个奇怪的问题 此问题仅在从 GMS 1 2 更新到 1 3 1 后才出现 其中 引用文档 https developers google com maps docum
  • 如何在操作表中添加日期选择器?

    IBAction showCatPicker if self catList nil self catList nil catList release self catList NSMutableArray alloc init self
  • 在 ios wifi 网络上查找对等点

    我试图弄清楚如何搜索登录到 wifi 网络且在特定端口上托管应用程序的其他设备 在不知道这些其他设备的地址甚至不知道它们托管的端口的情况下 如何检测它们的存在 一旦发现 我应该能够联系该设备并与其建立连接 最标准的 iOS方式 是使用Bon
  • 如何在iOS应用程序中实现互斥锁[重复]

    这个问题在这里已经有答案了 可能的重复 GCD 如何从两个线程写入和读取变量 https stackoverflow com questions 11070947 gcd how to write and read to variable
  • 块执行后变量返回 null

    我正在调度一个队列来在单独的线程上下载一些 flickr 照片 在 viewWillAppear 中 当我记录块内数组的内容时 它完美地显示了所有内容 dispatch queue t photoDowonload dispatch que
  • 在哪里可以找到有关 IOS 日历同步的优秀教程? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发 iPhone 应用程序 如何将新事件与 iOS 日历同步 您可以浏览此 github 代码
  • 当应用程序名称在 InfoPlist.strings 中本地化时,不同的应用程序名称取决于配置

    我们为每个配置使用具有不同 plist 的设置 像这样 目标 Info Dev plist 目标 Info Beta plist 这样我们的配置就可以拥有自己的 CFBundleDisplayName 并且我们可以通过设备上的应用程序名称来
  • 将深层链接传递到 iOS 模拟器?

    我想找到一种更简单的方法来在 iOS 模拟器中调用深层链接 在 Android 上 您可以使用 ADB 通过控制台将链接传输到模拟器中 是否有类似的方法或解决方法来打开最新 iOS 模拟器的深层链接 您可以在终端中输入以下内容 xcrun
  • 移动文件并覆盖[重复]

    这个问题在这里已经有答案了 即使同名文件已存在 我也尝试移动文件 NSFileManager moveItemAtURL location1 toURL location2 Does NSFileManager的方法moveItemAtUR
  • AudioKit - 立体声通道从输入翻转到输出?

    我正在使用 AudioKit 创建一个实验性 iOS 音频应用程序 目前 我正在尝试将 AKStereoInput 的左声道重新路由到 AudioKit output 的右声道 并将 AKStereoInput 的右声道重新路由到输出的左声
  • 无法转换“String”类型的值?预期参数类型“URL”

    我正在尝试从主包中的文件加载数据 当我使用这段代码时 let path Bundle main path forResource abc ofType txt let dataTwo try Data contentsOf path err
  • NSNumber numberWithInt 在数字 >= 13 上崩溃

    我对 Objective C 还很陌生 我已读完类似的问题 https stackoverflow com questions 2533355 nsnumber 13 wont retain everything else will但我不知
  • UIWebView stringByEvaluatingJavaScriptFromString 在后台

    在 iOS 应用程序中 我正在运行一个相当大的脚本UIWebView using stringByEvaluatingJavaScriptFromString 就 JavaScript 字符串的长度而言较大 调用 JavaScript 后会
  • 在模拟器上卸载应用程序后,NSUserDefaults 未清除

    这听起来可能很菜鸟 我想检查用户是否第二次进入我的应用程序 以便保留我正在使用的运行计数NSUserDefaults 我已经在我的中实现了以下代码rootViewController s viewDidLoad method NSUserD
  • 如何在UITextField上自动打开键盘?

    我有一个非常简单的表格 当触摸单元格时 它会打开一个带有一个 UITextfield 的新视图 我想要的只是键盘会自动打开 而用户无需触摸 UITextfield 这一切都是在 Interface Builder 中完成的 所以我不确定如何
  • 如何使用 Javascript 从 Chrome iOS 下载 blob 文件?

    如何使用 Javascript 从 Chrome iOS 下载 blob 文件 我正在从 iOS 下载文件 pdf excel txt png iOS 没有文件系统 这对下载来说是一个问题 我创建了一个代码 根据操作系统和导航器 如果需要
  • 将对象映射到 TableView 部分的 Swift 二维数组

    我想不出更好的方法来做到这一点 我将学生对象的所有属性映射到二维数组中 所以我的电视有几个部分 我也不能使用静态表视图 如果是这样 这个问题就不会存在 所以我在 TVC 中的代码 let currentUser PFUser current

随机推荐

  • R 绘图自定义数据格式变体

    我正在尝试访问customdata通过javascrit分配给每个数据点 例如为每个点分配一个超链接 然而 我注意到数据格式从一个图变为另一个图 这看起来很奇怪 这在本例中完美运行 基于this https stackoverflow co
  • WordPress:single.php 不显示 the_content()

    我正在创建一个自定义 WordPress 主题 但我似乎无法让 single php 模板正常工作 下面是我写的代码 标题出现了 但内容没有出现 有什么想法为什么不是吗 div div id post gt h2 a href title
  • 为什么要对 List< 进行泛型转换?将 Set..> 扩展为 List 在 Sun JDK 6 上成功,但在 Oracle JDK 7 上编译失败?

    下面的代码 class GenericCompilationFailureDemo List
  • 类型 IUserStore`1 没有可访问的构造函数

    我想使用 Unity 3 设置 MVC5 应用程序 我从标准模板创建了一个默认的 Web mvc5 应用程序 然后添加了 unity 当我访问 AccountController 中的注册操作时 出现以下异常 类型 IUserStore 1
  • 使用对象元素作为参数的 Firestore 查询

    我在项目中使用 Firestore 作为数据库 并且我有一个表 我需要在对象内执行查询 foo data bar data exObject dataToQuery value 这是一个结构示例 我想在对象内部进行查询 一个如下所示的查询
  • 具有定向光正交投影的 OpenGL 3+

    我目前遇到来自移动 类似太阳 光源的定向光阴影贴图的问题 当我最初实现时 光投影矩阵被计算为 3D 并且阴影贴图看起来很漂亮 然后我了解到 对于我想要做的事情 正交投影效果会更好 但我很难替换正确的投影矩阵 正如人们所期望的那样 每次滴答声
  • 包含 unistd.h 的 write() 包装例程会导致错误

    我正在编写一个包装例程write 要覆盖原始系统功能 并在其中我需要通过执行另一个程序execve 我为其添加了头文件unistd h 我收到错误conflicting types for write usr include unistd
  • 如何让Three.js全屏显示?

    我想用 Three js 制作游戏 但如何使其全屏显示 我看见本文 http learningthreejs com blog 2011 11 17 lets make a 3d game make it fullscreen 并且我在代码
  • Hibernate,更改标识符/主键

    当我尝试更改我的设置时 我收到以下异常 ID in an Entity identifier of an instance of com google search pagerank ItemEntity was altered from
  • 无法创建 Laravel 项目,因为缺少 mcrypt 扩展

    好吧 我看过很多关于这个问题的帖子 我花了一整天的时间来解决这个问题 但没有成功 我正在尝试创建一个 Laravel 项目 我使用的是 Mac Yosemite 运行 PHP 5 5 14 机器上还有旧版本的 PHP 当我尝试使用 lara
  • ionic 如何添加空白页面作为应用程序的主页?

    我想使用选项卡式菜单将新页面添加到默认离子应用程序中 并将此页面显示为应用程序的默认页面 我尝试这样做的方法如下 我在 app js 中添加了新状态 state home url home views home templateUrl te
  • 是否可以让Head JS的ready()函数等待两个脚本?

    我在网页上加载了三个脚本 我想在其中两个脚本完成加载后触发一个函数 head js webfont http ajax googleapis com ajax libs webfont 1 0 31 webfont js jquery ht
  • 如何缩小 SVG 元素联合的类型

    我正在使用 React 设置对 svg 元素的引用 该元素可能是
  • SQL 将列数据类型从 nvarchar 更改为 int

    字段的数据类型可以从 nvarchar 更改为 int 吗 alter table employee alter column designation int 这是有效的吗 如果不行的话可以用其他方式实现吗 PS 我正在使用MS SQL S
  • cordova:拍照后上传图像不起作用

    我正在开发一个使用 Apache Cordova 又名 Phonegap 开发的 iOS 应用程序 我想分两步上传照片 1 拍摄照片并以小尺寸显示照片 2 上传照片 我需要一个拍照按钮和一个上传按钮 我的脚本不起作用 怎么了 这是我的 Ja
  • 使用 STS 和 WCF 时遇到不安全或安全错误异常的问题

    我正在使用几个 WCF 服务 所有服务均使用 WIF 和 STS 提供程序进行保护 均使用开箱即用的 Microsoft 代码和示例 这些服务都是使用 NET 3 5 构建的 并且最近全部更新到 NET 4 0 ALL与服务相关的 dll
  • 错误:invalid_scope - 此应用尚未经过验证可以访问

    以前有人经历过这个错误吗 我一直在研究 测试并努力让这个错误消失 但似乎没有任何效果 这是与以下帖子类似的问题 错误 invalid scope google 读取联系人信息 https stackoverflow com question
  • 分解 Chrome 存储同步项目的算法

    我正在尝试使用 chrome storage sync set 保存一个字符串 更正 它是一个包含多个不同大小的字符串的对象 但收到错误 错误 超出 QUOTA BYTES PER ITEM 配额 这是因为限制为 8092 所以我想将字符串
  • 使用构建标签进行Android根检测?

    以下方法是我们以编程方式检测 Android 设备是否已 root 的方法之一 public boolean checkRootMethod1 String buildTags android os Build TAGS if buildT
  • 从数组末尾切片 NSArray

    切片 的最佳方法是什么NSArray从数组的末尾而不是开头开始 例如 查找包含 a 的最后几个元素的子数组 NSArray长度未知 在 Python 中 您可以使用负索引来完成此操作 例如 new list old list 5 3 在 O