【问题标题】:Understanding function with string validation理解带有字符串验证的函数
【发布时间】:2018-07-07 05:59:46
【问题描述】:

考虑以下:

extension String {

    func isValidEmail() -> Bool {
        let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
         print(characterset)
        if self.rangeOfCharacter(from: characterset.inverted) != nil {
            return false
        }   else {
            return true
        }

    }
}

var name = "Login"
name.isValidEmail() // print true
var incorretLogin = "Loginъ"
incorretLogin.isValidEmail() // print false

是的,功能就是工作。但我很困惑——它是如何工作的? 如果我理解正确,它的工作方式如下: 它需要一组字符,然后检查所有测试的字符串字符是否包含集合中的符号,如果不是,则返回false。

好的,但是倒置是为了什么?如果我删除倒置,结果将是错误的:

var name = "Login"
name.isValidEmail() // false
var incorretLogin = "Logъin"
incorretLogin.isValidEmail() // false

现在我什么都不懂。 如果函数只检查字符串字母是否来自字符集,那么设置反转与否又有什么关系呢? 谁能解释一下?

我在操场上玩了一下:

 let characterset = CharacterSet(charactersIn: "a")
        print(characterset)
        print(characterset.inverted)

打印相同的结果:

<CFCharacterSet Items(U+0061)>
<CFCharacterSet Items(U+0061)>

【问题讨论】:

标签: ios swift


【解决方案1】:

根据文档

rangeOfCharacter(from:)

查找并返回给定字符集中第一个字符的接收器范围。

接收者是被检查的字符串。如果在字符串中没有找到集合中的字符,则返回nil

当集合反转时,它包含所有无效字符。因此,rangeOfCharacter(from:) 返回第一个无效字符的位置。这就是您的第一种方法有效的原因。

当您删除inverted 时,调用会返回第一个有效 字符的位置。由于"Logъin" 既有有效字符又有无效字符,所以两个调用都返回false。如果您在完全由无效字符组成的字符串上调用第二个函数,例如"Логин",你会得到true

请注意,您可以通过删除 if 来简化实现:

let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
return self.rangeOfCharacter(from: characterset.inverted) == nil

【讨论】:

  • 谢谢,但请看下面我更新的问题。你怎么解释?反转或不设置都打印相同的结果。
  • @EvgeniyKleban 我认为它只是一个倒置集的打印神器 - iOS 打印它就像它没有被倒置一样。
  • 所以你说它只是打印错误,它“假设”包含除“a”之外的所有可能的字母?
  • @EvgeniyKleban 是的,我尝试了更多组合,这就是我的样子。
【解决方案2】:

inverted "返回接收者的反转副本。" (见https://developer.apple.com/documentation/foundation/characterset)。

在您的情况下,inverted 表示您在初始化程序中提供的所有字符除了(除字母和数字之外的所有字符)。因此,如果电子邮件字符串包含任何字母或数字的字符,该方法将返回 false

游乐场示例:

【讨论】:

  • 请检查我更新的问题。我检查结果是否反转,结果相同,为什么?
  • @EvgeniyKleban 查看我的游乐场示例。正如你在右边看到的,它们是不同的集合。虽然“原始”集包含字符 a,但反转集包含 not。相反,它包含字符 a 的所有字符 except
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2011-12-17
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多