Swift 4中如何搜索字符串子串?API使用及报错问题咨询
Swift 4中字符串包含检查与范围获取的正确姿势
我懂你踩的坑啦!你之所以会遇到那个报错,是因为混淆了Swift标准库和Foundation框架里的两个contains方法——Swift原生的contains(_:)只能检查单个Character,而你需要的是检查整个字符串是否存在的方法,这个是Foundation给String扩展的能力。
下面对应你Objective-C里的两个需求,给出Swift的实现:
1. 检查字符串是否包含子字符串
首先要确保你导入了Foundation(如果是iOS/macOS项目,导入UIKit或AppKit就自动包含Foundation了),然后直接用Foundation扩展的contains(_ string: String)方法:
import Foundation let s = "abcdefg" let ss = "cde" // 对应OC的 [s containsString:ss] print(s.contains(ss)) // 输出:true
2. 获取子字符串在原字符串中的范围
对应OC的rangeOfString:,Swift里用range(of:)方法,它返回一个可选的Range<String.Index>,我们可以安全解包后使用,还能转换成OC风格的NSRange:
// 对应OC的 [s rangeOfString:ss] if let swiftRange = s.range(of: ss) { // 转换成NSRange(方便和OC代码交互) let nsRange = NSRange(swiftRange, in: s) print(NSStringFromRange(nsRange)) // 输出:{2, 3} // 如果只需要Swift原生的位置信息 let startOffset = s.distance(from: s.startIndex, to: swiftRange.lowerBound) let length = s.distance(from: swiftRange.lowerBound, to: swiftRange.upperBound) print("起始偏移量:\(startOffset),长度:\(length)") } else { print("未找到子字符串") }
为什么你之前会报错?
你写的"abcdef".contains("cde")触发了Swift标准库的contains(_ element: Character)方法,编译器试图把字符串"cde"转换成单个Character(这显然做不到),所以才会抛出cannot convert value of type 'String' to expected argument type 'String.Element'的错误。只要导入Foundation,就能调用支持字符串参数的contains版本啦!
内容的提问来源于stack exchange,提问作者taichino
相关产品推荐
相关产品推荐

