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

alp*_*nse 1 string compare function swift

我想创建一个比较字符串的函数.我不想使用相等的运算符(==),我希望它只适用于Swift语言.

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

func isEqual(str1:String, str2:String) -> Bool {
    var result = false

    for char in str1 {

    }
    for char2 in str2 {

    }
    //Compare characters.
    return result
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 5

==适用于Swift中的Strings.出于教育目的 (正如我从你的评论中得出结论"因为我正在练习......")你可以将其实现为:

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
}
Run Code Online (Sandbox Code Playgroud)

zip(str1, str2) 返回给定序列的一系列对,这是一种"并行"枚举字符串的便捷方法.

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

func myStringCompare(str1 : String, str2 : String) -> Bool {

    return count(str1) == count(str2) && !contains(zip(str1, str2), { $0 != $1 })
}
Run Code Online (Sandbox Code Playgroud)

比较字符串长度是必要的,因为zip()一旦其中一个字符串耗尽,序列就会终止.看看@drewag对In Swift的回答我想将两个序列"连接"到一个元组序列中, 以获得另一个Zip2WithNilPadding序列.

如果您不想使用内置zip()函数(再次用于教育/自学习目的!)那么您可以使用字符串是序列的事实,并使用序列生成器并行枚举它们.这不仅适用于字符串,也适用于任意序列,只要可以测试底层元素是否相等,那么让它成为通用函数:

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
}
Run Code Online (Sandbox Code Playgroud)

测试:

mySequenceCompare("xa", "xb")  // false
mySequenceCompare("xa", "xa")  // true
mySequenceCompare("a", "aa")   // false
mySequenceCompare("aa", "a")   // false
Run Code Online (Sandbox Code Playgroud)