不久前,我读到可以使用以下代码片段来比较版本号:
NSString *vesrion_1 = @"1.2.1";
NSString *version_2 = @"1.2.0";
if ([version_1 compare:version_2 options:NSNumericSearch] == NSOrderedAscending) {
...
}这似乎工作得很好,但一个用户有一个问题,这是由于似乎不正确的版本号比较。
我的问题是,使用这种技术来比较版本号在所有情况下都是安全的吗?上面的比较有没有可能在不同的机器上导致不同的结果?
发布于 2011-03-02 05:04:14
我不知道有什么内置的可以做到这一点,但我听说Sparkle framework有一个版本比较器。
快速浏览一下源代码,就会发现SUStandardVersionComparator对象似乎负责管理它。它符合 protocol,这意味着您可以像这样使用它:
NSString *versionA = @"1.2.1";
NSString *versionB = @"1.2.0";
id <SUVersionComparison> comparator = [SUStandardVersionComparator defaultComparator];
NSInteger result = [comparator compareVersion:versionA toVersion:versionB];
if (result == NSOrderedSame) {
//versionA == versionB
} else if (result == NSOrderedAscending) {
//versionA < versionB
} else {
//versionA > versionB
}(注意:代码未经测试并在浏览器中键入。注意事项实施者)
发布于 2012-06-13 23:25:26
我已经在GitHub上开发了一个VersionComparator,它非常轻巧,使用起来也很简单--不像其他一些解决方案那样功能丰富,但很容易上手和使用。
BOOL greater = [VersionComparator isVersion:@"2.0.0" greaterThanVersion:@"1.1.0"];它只是简单地比较从主版本到构建版本的数字-如果2大于1,则不需要进一步比较。
它的目的是提供尽可能简单的前端代码(如上面的示例),也不提供具有大量支持代码的类。通常情况下,这就是我们所需要的。
发布于 2013-03-19 00:27:19
NSNumericSearch应该完全按照您的要求进行操作。它可以处理您期望从版本号中得到的所有情况。在之前的一个项目中,我为此编写了一系列测试用例:
+ (NSComparisonResult)compareBundleVersion:(NSString *)a withBundleVersion:(NSString *)b
{
return [a compare:b options:NSNumericSearch];
}
STAssertEquals(NSOrderedSame, [self compareBundleVersion:@"1" withBundleVersion:@"1"], nil);
STAssertEquals(NSOrderedSame, [self compareBundleVersion:@"1.0" withBundleVersion:@"1.0"], nil);
STAssertEquals(NSOrderedSame, [self compareBundleVersion:@"1.1.12" withBundleVersion:@"1.1.12"], nil);
STAssertEquals(NSOrderedAscending, [self compareBundleVersion:@"1" withBundleVersion:@"2"], nil);
STAssertEquals(NSOrderedAscending, [self compareBundleVersion:@"1" withBundleVersion:@"1.1"], nil);
STAssertEquals(NSOrderedAscending, [self compareBundleVersion:@"1.0" withBundleVersion:@"1.1"], nil);
STAssertEquals(NSOrderedAscending, [self compareBundleVersion:@"1.1.12" withBundleVersion:@"1.1.13"], nil);
STAssertEquals(NSOrderedAscending, [self compareBundleVersion:@"1.1.12" withBundleVersion:@"1.2.1"], nil);
STAssertEquals(NSOrderedDescending, [self compareBundleVersion:@"1.1" withBundleVersion:@"1"], nil);
STAssertEquals(NSOrderedDescending, [self compareBundleVersion:@"1.1" withBundleVersion:@"1.0"], nil);
STAssertEquals(NSOrderedDescending, [self compareBundleVersion:@"1.1.13" withBundleVersion:@"1.1.12"], nil);
STAssertEquals(NSOrderedDescending, [self compareBundleVersion:@"1.2.1" withBundleVersion:@"1.1.12"], nil);我也用另一个帖子提到的以前的案例进行了测试:
STAssertEquals(NSOrderedDescending, [self compareBundleVersion:@"1.30" withBundleVersion:@"1.3"], nil);
STAssertEquals(NSOrderedDescending, [self compareBundleVersion:@"1.19" withBundleVersion:@"1.3"], nil);一切都像你所期望的那样过去。
https://stackoverflow.com/questions/5160216
复制相似问题