菜鸟教程小白 发表于 2022-12-13 16:12:00

iphone - 如何在Objective-C中一个数字中的部分较少的版本号上使用比较?


                                            <p><p>我在 <a href="http://snipplr.com/view/2771" rel="noreferrer noopener nofollow">http://snipplr.com/view/2771</a> 找到了以下代码</p>

<p>这非常好,几乎正是我想要的,但是如果我使用值 <code>@"1.4.5", @"10.4"</code> 它会产生错误的结果,说第一个数字较低。</p>

<p><strong>Arghhhh 深夜编码,抱歉,我将 10.4 读作 1.4 :(</strong></p>

<p>我不确定为什么 compare 有问题,问题是什么?</p>

<pre><code>/*
* compareVersions(@&#34;10.4&#34;,             @&#34;10.3&#34;); //            
       returns NSOrderedDescending (1) - aka first number is higher

* compareVersions(@&#34;10.5&#34;,             @&#34;10.5.0&#34;); //         
       returns NSOrderedSame (0)

* compareVersions(@&#34;10.4 Build 8L127&#34;, @&#34;10.4 Build 8P135&#34;); //
       returns NSOrderedAscending (-1) - aka first number is lower
*/
NSComparisonResult compareVersions(NSString* leftVersion, NSString* rightVersion)
{
    int i;

    // Break version into fields (separated by &#39;.&#39;)
    NSMutableArray *leftFields= [ initWithArray:];
    NSMutableArray *rightFields = [ initWithArray:];

    // Implict &#34;.0&#34; in case version doesn&#39;t have the same number of &#39;.&#39;
    if ( &lt; ) {
      while ( != ) {
            ;
      }
    } else if ( &gt; ) {
      while ( != ) {
            ;
      }
    }
</code></pre>

<p>.</p>

<pre><code>    // Do a numeric comparison on each field
    for(i = 0; i &lt; ; i++) {
      NSComparisonResult result = [ compare: options:NSNumericSearch];
      if (result != NSOrderedSame) {
            ;
            ;
            return result;
      }
    }

    ;
    ;
    return NSOrderedSame;
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>[我今天早些时候发布了这个,但它没有被选为答案,它可能更适合你的问题。还有其他技巧,可以看<a href="https://stackoverflow.com/q/3339722/1633251" rel="noreferrer noopener nofollow">here</a>和 <a href="https://stackoverflow.com/q/12300794/1633251" rel="noreferrer noopener nofollow">here</a>其他解决方案。]</p>

<p>我所做的就是将该字符串分解为组件:</p>

<pre><code>NSArray *array = ;

NSInteger value = 0;
NSInteger multiplier = 1000000;
for(NSString *n in array) {
value += * multiplier;
multiplier /= 100;
}
</code></pre>

<p>它的作用是为您提供一个可用于比较的标准化值,并且通常会比较具有不同“深度”的版本,即 1.5 和 1.5.2。 </p>

<p>如果您有超过 100 个点发布(即任何数字大于 100),它就会中断,并且还会声明 1.5.0 == 1.5。也就是说,它简短、甜美且易于使用。</p>

<p>编辑:如果您使用 NSString 'compare:options:' 方法,请确保您的字符串修饰得很好:</p>

<pre><code>    s1 = @&#34;1.&#34;;
    s2 = @&#34;1&#34;;
    NSLog(@&#34;Compare %@ to %@ result %d&#34;, s1, s2, (int));
    s1 = @&#34;20.20.0&#34;;
    s2 = @&#34;20.20&#34;;
    NSLog(@&#34;Compare %@ to %@ result %d&#34;, s1, s2, (int));

2012-09-06 11:26:24.793 xxx Compare 1. to 1 result 1
2012-09-06 11:26:24.794 xxx Compare 20.20.0 to 20.20 result 1
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - 如何在Objective-C中一个数字中的部分较少的版本号上使用比较?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12308659/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12308659/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - 如何在Objective-C中一个数字中的部分较少的版本号上使用比较?