You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:28:45