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 } |
一旦你了解了它的工作原理,你就可以缩短它,例如:
1 2 3 4 | func myStringCompare(str1 : String, str2 : String) -> Bool { return count(str1) == count(str2) && !contains(zip(str1, str2), { $0 != $1 }) } |
比较字符串长度是必要的,因为
如果您不想使用内置的
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字符。"
有关扩展图形集群的详细信息,请链接