首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较版本号

比较版本号
EN

Stack Overflow用户
提问于 2011-03-02 04:54:04
回答 7查看 3.1K关注 0票数 2

不久前,我读到可以使用以下代码片段来比较版本号:

代码语言:javascript
复制
NSString *vesrion_1 = @"1.2.1";
NSString *version_2 = @"1.2.0";

if ([version_1 compare:version_2 options:NSNumericSearch] == NSOrderedAscending) {
...
}

这似乎工作得很好,但一个用户有一个问题,这是由于似乎不正确的版本号比较。

我的问题是,使用这种技术来比较版本号在所有情况下都是安全的吗?上面的比较有没有可能在不同的机器上导致不同的结果?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-02 05:04:14

我不知道有什么内置的可以做到这一点,但我听说Sparkle framework有一个版本比较器。

快速浏览一下源代码,就会发现SUStandardVersionComparator对象似乎负责管理它。它符合 protocol,这意味着您可以像这样使用它:

代码语言:javascript
复制
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
}

(注意:代码未经测试并在浏览器中键入。注意事项实施者)

票数 3
EN

Stack Overflow用户

发布于 2012-06-13 23:25:26

我已经在GitHub上开发了一个VersionComparator,它非常轻巧,使用起来也很简单--不像其他一些解决方案那样功能丰富,但很容易上手和使用。

代码语言:javascript
复制
BOOL greater = [VersionComparator isVersion:@"2.0.0" greaterThanVersion:@"1.1.0"];

它只是简单地比较从主版本到构建版本的数字-如果2大于1,则不需要进一步比较。

它的目的是提供尽可能简单的前端代码(如上面的示例),也不提供具有大量支持代码的类。通常情况下,这就是我们所需要的。

票数 4
EN

Stack Overflow用户

发布于 2013-03-19 00:27:19

NSNumericSearch应该完全按照您的要求进行操作。它可以处理您期望从版本号中得到的所有情况。在之前的一个项目中,我为此编写了一系列测试用例:

代码语言:javascript
复制
+ (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);

我也用另一个帖子提到的以前的案例进行了测试:

代码语言:javascript
复制
STAssertEquals(NSOrderedDescending, [self compareBundleVersion:@"1.30" withBundleVersion:@"1.3"], nil);
STAssertEquals(NSOrderedDescending, [self compareBundleVersion:@"1.19" withBundleVersion:@"1.3"], nil);

一切都像你所期望的那样过去。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5160216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档