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
给。
我有一个指向 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
给。