Foundation — NSString

localizedCaseInsensitiveContains #

localizedCaseInsensitiveContains 是什么? #

localizedCaseInsensitiveContainsString 在 Swift 中的一个方法,用于检查目标字符串是否包含指定字符串,检查时忽略大小写且遵循本地化规则(如语言、字符集等)

  • 作用:判断目标字符串是否包含子字符串,匹配时不会区分大小写。例如,“Hello” 和 “hello” 会被视为相同。
  • 本地化规则:会根据用户的语言环境和特定字符的规则适应语言差异,正确处理大小写转换。例如,德语中 “ß” 和 “ss”,土耳其语中的点和不带点的 “i” 等。

方法声明 #

func localizedCaseInsensitiveContains(_ other: String) -> Bool
  • 参数
    • other:目标输入的子字符串,即你要查找的内容。
  • 返回值:布尔值
    • true:如果目标字符串包含该子字符串。
    • false:如果目标字符串不包含该子字符串。

使用场景 #

  1. 忽略大小写的字符串包含检查:通过本地化规则判断子字符串是否存在,而无需手动转换大小写。
  2. 本地化字符串搜索:根据用户语言和地区设置,特别是支持不同语言规则的内容查找。
  3. 增强搜索功能: 提供更自然、用户友好的匹配功能,例如搜索栏或搜索功能中支持忽略大小写的输入。

基础用法 #

示例 1:简单比较 #

let text = "Hello, SwiftUI!"
let keyword = "hello"

if text.localizedCaseInsensitiveContains(keyword) {
    print("The text contains '\(keyword)'!")
} else {
    print("The text does not contain '\(keyword)'!")
}

输出

The text contains 'hello'!

示例 2:在本地化中查找 #

let turkishWord = "İstanbul" // 土耳其的 "i" 是带点的大写字母
let keyword = "istanbul"

if turkishWord.localizedCaseInsensitiveContains(keyword) {
    print("The text contains '\(keyword)'!")
} else {
    print("The text does not contain '\(keyword)'!")
}

输出

The text contains 'istanbul'!

在一些语言环境中,String.lowercased()String.uppercased() 转换规则可能特殊(如土耳其语中的 “İ” 和 “i”)。localizedCaseInsensitiveContains 可以准确处理这种场景。


典型使用场景 #

1. 搜索功能 #

localizedCaseInsensitiveContains 最常用于搜索相关功能,比如过滤一个字符串列表,以匹配用户输入的关键词。

let products = [
    "iPhone 15",
    "MacBook Air",
    "Apple Watch",
    "iPad Mini"
]

let searchText = "macbook"

let searchResults = products.filter { product in
    product.localizedCaseInsensitiveContains(searchText)
}

print("Search Results: \(searchResults)")

输出

Search Results: ["MacBook Air"]

2. 用户名或邮箱过滤 #

通过 localizedCaseInsensitiveContains,可以轻松忽略大小写匹配部分用户数据。

let users = [
    "JohnDoe@gmail.com",
    "AliceAdventures@gmail.com",
    "admin@swiftlanguage.org"
]

let searchKeyword = "admin"

let result = users.filter { user in
    user.localizedCaseInsensitiveContains(searchKeyword)
}

print("Filtered Users: \(result)")

输出

Filtered Users: ["admin@swiftlanguage.org"]

3. 多语言支持的匹配 #

localizedCaseInsensitiveContains 遵循系统的本地化配置,非常适合多语言、多地区的内容过滤和检查。

let germanText = "straße" // 在德语中,"ß" 是一个特定的符号,表示 "ss"
let searchWord = "strasse" // 替代写法

if germanText.localizedCaseInsensitiveContains(searchWord) {
    print("The German text matches the search!")
} else {
    print("No match found.")
}

输出

The German text matches the search!

与其他方法的对比 #

1. contains #

默认的 contains 方法 区分大小写,并且 不会遵循本地化规则

let text = "Hello Swift!"
let keyword = "hello"

if text.contains(keyword) {
    print("Contains")
} else {
    print("Does not contain")
}

输出

Does not contain

2. range(of:options:) #

range(of:options:) 提供更多选项来搜索字符串,包括大小写忽略(设置 .caseInsensitive),但需要显式指定。

let text = "Hello, SwiftUI!"
let keyword = "hello"

if text.range(of: keyword, options: .caseInsensitive) != nil {
    print("The text contains '\(keyword)'!")
} else {
    print("The text does not contain '\(keyword)'!")
}

输出

The text contains 'hello'!

localizedCaseInsensitiveContains 简化了这种操作,更适合直接判断字符串匹配。


注意事项 #

  1. 匹配的本地化规则:

    • 由于它使用用户所在区域的本地化规则,因此在跨语言字符串搜索时,可能会出现不同的匹配行为。
    • 确保你了解目标语言的大小写规范,尤其是特殊字符支持(例如德语 "ß"、土耳其语 "İ")。
  2. 性能问题:

    • 对于长字符串频繁调用时,可能会带来性能开销,因为本地化规则需要负载一定的解析。
    • 如果不需要本地化,且可以接受大小写简单转换,建议使用 lowercased() 手动标准化处理。
  3. API 可用性:

    • localizedCaseInsensitiveContains 方法适用于 Swift 5 中的 String,且兼容所有 Apple 平台。

总结 #

  • localizedCaseInsensitiveContains 是一种高效且用户友好的字符串匹配方式,能够根据用户语言处理大小写忽略且更贴合实际用户需求。
  • 适合用于搜索、过滤、内容匹配等功能中,尤其在需要支持多语言或不同地区习惯的项目里非常强大。
  • 与其他方法相比,它用法简洁,推荐在需要本地化支持的情况下优先使用。

可以在你的项目中使用它,尤其是多语言和大小写忽略的字符串匹配。如果还有疑问,欢迎继续深入探讨! 😊

本文共 1568 字,上次修改于 Jan 10, 2025