更新 substring(to:) 导致无法推断通用参数

Posted

技术标签:

【中文标题】更新 substring(to:) 导致无法推断通用参数【英文标题】:updating substring(to:) results in generic parameter could not be inferred 【发布时间】:2017-11-07 02:27:07 【问题描述】:

我正在使用一个使用 substring(to:) 的框架,该框架现已在 swift 4 中被弃用。

let split = stripped.substring(to: stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)

我将其更新为下面的代码,但现在我收到“无法推断通用参数”错误,并且“..”带有下划线。

let split = stripped[..<stripped.range(of: ";")?.lowerBound ?? stripped.endIndex]

不知道我应该如何解决这个问题。

【问题讨论】:

let split = stripped[..&lt;(stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)] 只需在你的上界添加一个括号 【参考方案1】:

让我们把这段代码更清楚一点:

let range = stripped.range(of: ";")?.lowerBound ?? stripped.endIndex
let split = String(stripped[..<range])

但您似乎想在某个字符之前获取子字符串。我有另一种方法:

let split: String = stripped.components(separatedBy: ";").first!

【讨论】:

谢谢!这不是我自己编写的代码,我很难理解发生了什么。你能解释一下吗? 如果没有“;”,则获取从开始到分隔符“;”的子字符串在字符串中,取而代之的是整个字符串(从开始到结束索引)【参考方案2】:

编译器无法推断您的范围隐式strippedstartIndex 开始。您必须明确指定范围的开头:

let split = stripped[stripped.startIndex..<(stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)]

实际上,这很难阅读,所以考虑编写一点更简洁的代码:

let endIndex = stripped.range(of: ";")?.lowerBound ?? stripped.endIndex
let split = stripped[stripped.startIndex..<endIndex]

【讨论】:

以上是关于更新 substring(to:) 导致无法推断通用参数的主要内容,如果未能解决你的问题,请参考以下文章

jpa缓存导致无法查询到更新后的数据&android出现ANR的一个解决办法

Diesel join 无法推断类型

更新浏览器,导致编写脚本报错Message: Unable to find a matching set of capabilities

Swift 4:'substring(to:)' 已弃用 [重复]

移动查勘通赔版本系统上线-对接理赔失败,导致案件无法正常下发及处理

HP刀片服务器重装linux系统后,无法ping通网关和同网段IP,是啥原因导致?