如何制作一个比较字符串的函数?

How to make a function that compares strings?

我想做一个比较字符串的函数。我不想使用等号运算符(=),我只希望它与swift语言一起使用。

首先,我创建了一个函数,它接受2个字符串,并返回bool类型。然后在语法中用for循环这些字符串。并且要比较这些字符,如果字符串的值相等,则应该返回true,否则返回false。有更好的方法吗?

1
2
3
4
5
6
7
8
9
10
11
12
func isEqual(str1:String, str2:String) -> Bool {
    var result = false

    for char in str1 {

    }
    for char2 in str2 {

    }
    //Compare characters.
    return result
}


==使用快速的字符串可以很好地工作。用于教育目的(正如我从你的评论中得出的结论,"因为我在练习……"您可以将其实现为:

1
2
3
4
5
6
7
8
9
10
11
12
func myStringCompare(str1 : String, str2 : String) -> Bool {

    if count(str1) != count(str2) {
        return false
    }
    for (c1, c2) in zip(str1, str2) {
        if c1 != c2 {
            return false
        }
    }
    return true
}

zip(str1, str2)从给定的序列,这是枚举字符串的方便方法"并行"。

一旦你了解了它的工作原理,你就可以缩短它,例如:

1
2
3
4
func myStringCompare(str1 : String, str2 : String) -> Bool {

    return count(str1) == count(str2) && !contains(zip(str1, str2), { $0 != $1 })
}

比较字符串长度是必要的,因为zip()序列当字符串之一用尽时终止。看一看@Drewag对swift的回答是,我想把两个序列"连接"成一个元组序列。对于替代的Zip2WithNilPadding序列。

如果您不想使用内置的zip()功能(对于教育/自学目的!)然后你可以利用这个事实字符串是序列,并使用序列发生器。这不仅适用于字符串,而且对于任意序列,只要基础元素测试是否相等,让我们将其设为泛型函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func mySequenceCompare<S : SequenceType where S.Generator.Element : Equatable>(lseq : S, rseq : S) -> Bool {

    var lgen = lseq.generate()
    var rgen = rseq.generate()

    // First elements (or `nil`):
    var lnext = lgen.next()
    var rnext = rgen.next()
    while let lelem = lnext, relem = rnext {
        if lelem != relem {
            return false
        }
        // Next elements (or `nil`):
        lnext = lgen.next()
        rnext = rgen.next()
    }

    // Are both sequences exhausted?
    return lnext == nil && rnext == nil
}

测验:

1
2
3
4
mySequenceCompare("xa","xb")  // false
mySequenceCompare("xa","xa")  // true
mySequenceCompare("a","aa")   // false
mySequenceCompare("aa","a")   // false


我的解决方案有点不一样,因为我不知道邮政操作员,我想不如马丁的一篇文章有效地使用了tuple。

问得好,阿方斯

1
2
3
4
5
6
7
8
9
10
11
12
13
func isEqual(str1:String, str2:String) -> Bool {
    if count(str1) != count(str2){
        return false
    }
    for var i = 0; i < count(str1); ++i {
        let idx1 = advance(str1.startIndex,i)
        let idx2 = advance(str2.startIndex,i)
        if str1[idx1] != str2[idx2]{
           return false
        }
    }
    return true
}

正如Martin所指出的,每个字符串都需要自己的索引,正如他所解释的那样:"诡计"是什么?????"是一个"扩展图形簇",由两个Unicode码位组成,但计为一个Swift字符。"

有关扩展图形集群的详细信息,请链接