Swift 中的空字符串

如何判断一个字符串是空? 这取决于你所说的“空”。可能意味着零长度的字符串,或者是一个可选的字符串也就是 nil。什么是“空白”只包含空格的字符串。让我们看看如何测试这几种情况。

用 【 isEmpty】

Swift 的 String 是一个字符的集合,Collection protocol 已经有一个用来判断空的方法:

var isEmpty: Bool { get }

Collection.swift 源码中可以找到

public var isEmpty: Bool {
  return startIndex == endIndex
}

如果 startIndex 和 endIndex 相同,那么就是空,可以利用这个来判空:

"Hello".isEmpty  // false
"".isEmpty       // true

Note: 用 “count”来判断空,它是遍历了整个string

// 不要这样去判断空
myString.count == 0

空格呢?

有时候想测试空格的string,例如,我想做如下测试看看是否返回true:

" "        // space
"\t\r\n"   // tab, return, newline
"\u{00a0}" // Unicode non-breaking space
"\u{2002}" // Unicode en space
"\u{2003}" // Unicode em space

有人通过判断字符是不是空白从而判断文字是否是空的。Swift 5中,我们可以利用为空白字符属性直接测试。我们可以编写这样的例子:

func isBlank(_ string: String) -> Bool {
  for character in string {
    if !character.isWhitespace {
        return false
    }
  }
  return true
}

这是有用的,用 【allSatisfy】更加简单简单的。给【String】添加一个扩展:

extension String {
  var isBlank: Bool {
    return allSatisfy({ $0.isWhitespace })
  }
}
  @inlinable
  public func allSatisfy(
    _ predicate: (Element) throws -> Bool
  ) rethrows -> Bool {
    return try !contains { try !predicate($0) }
  }
"Hello".isBlank        // false
"   Hello   ".isBlank  // false
"".isBlank             // true
" ".isBlank            // true
"\t\r\n".isBlank       // true
"\u{00a0}".isBlank     // true
"\u{2002}".isBlank     // true
"\u{2003}".isBlank     // true

可选的字符串呢?

给可选类型的字符串添加一个扩展:

extension Optional where Wrapped == String {
  var isBlank: Bool {
    return self?.isBlank ?? true
  }
}

使用可选链和一个默认的 true,如果我们使用的可选的字符串是nil,我们使用例子来测试【 isBlank】属性:

var title: String? = nil
title.isBlank            // true
title = ""               
title.isBlank            // true
title = "  \t  "               
title.isBlank            // true
title = "Hello"
title.isBlank            // false

遍历字符串判断空白还是有问题的,使用【isEmpty】就够了。

翻译自Empty Strings in Swift

你可能感兴趣的:(Swift 中的空字符串)