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

String 如何制作比较字符串的函数?,string,function,swift,compare,String,Function,Swift,Compare,我想做一个比较字符串的函数。 我不想使用相等运算符(=),我希望它只适用于Swift语言 首先,我创建了一个函数,它接受2个字符串,并返回bool类型。 然后我在语法中用for循环这些字符串。 要比较这些字符,如果字符串的值相等,它应该返回true,如果不是,则返回false。还有更好的办法吗 func isEqual(str1:String, str2:String) -> Bool { var result = false for char in str1 {

我想做一个比较字符串的函数。 我不想使用相等运算符(=),我希望它只适用于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
}

=
可以在Swift中处理字符串。出于教育目的 (正如我从你的评论“因为我在练习……”中得出的结论) 您可以将其实现为:

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)
从给定的 序列,这是枚举字符串的方便方法 “并行”

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

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

    return count(str1) == count(str2) && !contains(zip(str1, str2), { $0 != $1 })
}
比较字符串长度是必要的,因为
zip()
序列 当其中一个字符串用尽时终止。看看 @德雷瓦格的回答 对于另一种
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
}

=
可以在Swift中处理字符串。出于教育目的 (正如我从你的评论“因为我在练习……”中得出的结论) 您可以将其实现为:

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)
从给定的 序列,这是枚举字符串的方便方法 “并行”

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

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

    return count(str1) == count(str2) && !contains(zip(str1, str2), { $0 != $1 })
}
比较字符串长度是必要的,因为
zip()
序列 当其中一个字符串用尽时终止。看看 @德雷瓦格的回答 对于另一种
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
}

我的解决方案有一点不同,因为我不知道zip操作符,我想它不如Martin的一篇关于元组的文章有效

大问题阿方斯

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
}
func-isEqual(str1:String,str2:String)->Bool{
如果计数(str1)!=计数(str2){
返回错误
}
对于变量i=0;i
正如Martin所指出的,每个字符串都需要自己的索引,正如他所解释的:
“诀窍”是“我的解决方案有一点不同,因为我不知道zip操作符,我想它不如Martin的一篇文章“使用了元组”

大问题阿方斯

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
}
func-isEqual(str1:String,str2:String)->Bool{
如果计数(str1)!=计数(str2){
返回错误
}
对于变量i=0;i
正如Martin所指出的,每个字符串都需要自己的索引,正如他所解释的:
“诀窍”是“为什么你不想使用
==
?你说的“我希望它只适用于Swift语言”是什么意思?@ABakerSmith因为我在练习…@Martin R我的意思是我不想使用诸如“NSComparisonResult”之类的词。我只想使用Swift基本语法。你为什么不想使用
=
?你说的是什么意思“我希望它只适用于Swift语言”?@ABakerSmith,因为我正在练习…@Martin R我的意思是我不想使用诸如“NSComparisonResult”之类的用法。我只想使用Swift基本语法。你不能将从
str1
创建的
idx
与另一个字符串
str2
一起使用。试试
isEqual(“非常诡计,我尝试了几个不同的选项,但我没有使用表情符号,谢谢我会更新它现在它工作:)–诡计是“区域指标”“谢谢@MartinR,学习一些新的东西,可以避免在网络中很难找到的bugfuture@alphonse它也帮助了我,老实说,提出这个代码并不是一件小事,最后我学到了一个新的关于字符串的想法,我不知道你不能将从
str1
创建的
idx
与另一个字符串
str2
一起使用。尝试
isEqual(“非常诡计,我尝试了几个不同的选项,但我没有使用表情符号,谢谢,我会更新它现在它起作用了:)–诡计是“区域指示器”“谢谢@MartinR刚刚学到一些新东西,可以避免在future@alphonse它也帮助了我,老实说,提出这段代码并不是一件小事,最后我学到了这个新的关于字符串的思考,我不知道这是一个很好的教训!!它真的帮助我理解了斯威夫特。我还尝试将这些字符放入一个新数组,并比较数组中的每个项目。:)谢谢你。thnkas Martin给我上了一堂很好的课!!它真的帮助我理解了斯威夫特。我还尝试将这些字符放入一个新数组,并比较数组中的每个项目。:)非常感谢。