我想做一个比较字符串的函数。我不想使用相等的运算符(==),我希望它仅适用于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中可以很好地与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
}
zip(str1, str2)
返回给定序列中的一对序列,这是枚举“并行”字符串的便捷方法。
了解了它的工作原理后,可以将其缩短,例如:
func myStringCompare(str1 : String, str2 : String) -> Bool {
return count(str1) == count(str2) && !contains(zip(str1, str2), { $0 != $1 })
}
比较字符串长度是必要的,因为zip()
一旦其中一个字符串用完,序列就会终止。看看@drewag对在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
}
测试:
mySequenceCompare("xa", "xb") // false
mySequenceCompare("xa", "xa") // true
mySequenceCompare("a", "aa") // false
mySequenceCompare("aa", "a") // false
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句