Swift中如何判断字符是否为空串

1,306 阅读3分钟
一、前言

开发的过程中经常要判断字符串是否为空,包括包含多个空格的字符串,如"  ",这个字符串在程序中也要判别为空串。那么如何判断字符串为空呢

二、系统提供的方法

可以用系统原生的方法判断

  • 通过字符串自带的属性isEmpty判断是否为空:

A Boolean value indicating whether a string has no characters

var text = "hello!"
//如果有字符返回false,如果没有字符返回true.但是如果字符串是空格或换行符,则认为存在字符返回false
text.isEmpty 
  • 通过获取字符串的字符数count判断是否为空:
var text = "hello!"
//如果字符数大于0,则认为字符串不为空,如果字符数等于0,则认为字符串为空。但是如果字符串是空格或换行符,则 count会大于0,字符串不为空
text.count == 0 

可见以上两种方法无法处理text = "  "text = "\n"这些形式的字符串,也就是说Swift认为" "不是空字串!

所以我们可以通过对String进行扩展其属性来实现,看下边。

三、对String的扩展方法

先来个测试代码

class ViewController: UIViewController {
    //text的值可以修改为:"","  "," 哈哈","\n"进行测试
    var text = "哈哈"
    override func viewDidLoad() {
        super.viewDidLoad()
        print("isEmpty:\(text.isEmpty)")
        print("count:\(text.count == 0)")
        print("isBlank:\(text.isBlank)")
        print("isReBlank:\(text.isReBlank)")
    }
}

extension String{
    /// 通过高阶函数allSatisfy,判断字符串是否为空串
    var isBlank:Bool{
        /// 字符串中的所有字符都符合block中的条件,则返回true
        let _blank = self.allSatisfy{
            let _blank = $0.isWhitespace
            print("字符:\($0) \(_blank)")
            return _blank
        }
        return _blank
    }
    ///通过裁剪字符串中的空格和换行符,将得到的结过进行isEmpty
    var isReBlank:Bool{
        let str = self.trimmingCharacters(in: .whitespacesAndNewlines)
        return str.isEmpty
    }
}
  • 使用allSatisfy和isWhitespace进行扩展:   1. allSatisfy是swift中提供的阶函数,表示所有元素是否满足符合设定的条件,并返回bool值。

  2. isWhitespace是Character的一个属性,用户判定字符是否是空。

A Boolean value indicating whether this character represents whitespace, including newlines.

For example, the following characters all represent whitespace:

//以下字符均表示空白

"\t" (U+0009 CHARACTER TABULATION)

" " (U+0020 SPACE)

U+2029 PARAGRAPH SEPARATOR

U+3000 IDEOGRAPHIC SPACE

  3. 代码思想:   通过allSatisfy遍历字符串中的每个字符,将每个字符做isWhitespace判断,如果发现有一个字符返回false,则结束遍历,扩展属性返回当前字符串不为空字符串的判定。

/// 通过高阶函数allSatisfy,判断字符串是否为空串
      var isBlank:Bool{
          /// 字符串中的所有字符都符合block中的条件,则返回true
          let _blank = self.allSatisfy{
              let _blank = $0.isWhitespace
              print("字符:\($0) \(_blank)")
              return _blank
          }
          return _blank
      }

eg. 如果text = "  ",text.isBlank的结果为true

  • 使用trimmingCharacters进行扩展:   1. trimmingCharacters:修剪字符      用于截取字符串,根据CharacterSet的配置处理截取字符串,这里用到了whitespacesAndNewlines,表示将字符串中的空格和换行符去除。

  2. characterSet:字符集      字符集,也就是一堆字符的集合,就是说把我们平常见到的单个字符按照一定的条件进行了分类

 CharacterSet.whitespacesAndNewlines--空格和换行符;

  CharacterSet.letters--所有英文字母的集合;   3. 代码思想:

将需要校验的字符串中的空格或换行符删除,获得新的字符串,再片段新字符串的isEmpty是否为空,进而校验完成原始字符串

///通过裁剪字符串中的空格和换行符,将得到的结过进行isEmpty
 var isReBlank:Bool{
      let str = self.trimmingCharacters(in: .whitespacesAndNewlines)
      return str.isEmpty
}

eg.果text = "  ",经过trimmingCharacters处理后变为text = "",再调用isEmpty,判定字符串为空