Objective-C 带范围的子串

Objective-C Substring with range

我有一个指向 URL 的 NSString,像这样:

https://.../uploads/video/video_file/115/spin_37.mp4

我想从 NSString 获取我的 iOS 应用程序中的文件名(在本例中,spin_37.mp4)

我正在尝试以下操作:

NSUInteger *startIndex = [self.videoURL rangeOfString:@"/" options:NSBackwardsSearch].location+1;
NSUInteger *endIndex = [self.videoURL length] - startIndex;

NSString *fileName = [self.videoURL substringWithRange:(startIndex, endIndex)];

但是我 运行 在使用 NSUInteger 时遇到了很多错误,即现在

Invalid operands to binary expression ('unsigned long' and 'NSUInteger *' (aka 'unsigned long *'))

谁能解释一下我做错了什么?

你总是可以只使用 NSString's lastPathComponent API,它会带一个带有“https://.../uploads/video/video_file/115/spin_37.mp4”和 return“spin_37.mp4”的 NSString 给你。

你应该使用 NSString 的 lastPathComponent 方法:

NSString *pathString = @"https://.../uploads/video/video_file/115/spin_37.mp4";
NSString *fileName = [pathString lastPathComponent];
NSLog(@"fileName: %@", fileName);

控制台输出:

2015-04-19 17:04:25.992 MapTest[43165:952142] fileName: spin_37.mp4
(lldb)

迈克尔已经给了你一个很好的方法来实现你想做的事情。但是,关于您的问题,您做错了几件事,导致您无法编译您编写的代码。首先,您声明了指向 NSUInteger 对象的错误指针; NSRange.location(第一行)和 -length(第二行)returns 都不是指针,因此您的前两行应该声明常规 NSUInteger。其次,您的第二行应该计算子字符串的长度,而不是结束索引(因为这是 NSRange 所要求的。最后,您的最后一行试图传递两个整数值而不是 NSRange,这是方法 -substringWithRange: 接受的参数。因此,要编译,您的代码应为:

NSUInteger startIndex = [self.videoURL rangeOfString:@"/" 
    options:NSBackwardsSearch].location+1;
NSUInteger length = [self.videoURL length] - startIndex - 1;

NSString *fileName = [self.videoURL substringWithRange:NSMakeRange(startIndex, length)];

但是,使用 NSString-lastPathComponent 方法,正如 Michael 已经建议的那样,可能会为问题提供更清晰的解决方案,因为在这种情况下,您似乎不需要更细粒度的控制NSRange 给。