`UTF16Index()` 或 `UTF16Index.init(encodedOffset:)` 用于 Xcode 8/9 支持
`UTF16Index()` or `UTF16Index.init(encodedOffset:)` for Xcode 8/9 support
我所在的开发团队同时支持 Xcode 8 和 Xcode 9。
我正在开发一个在 Xcode 8 中使用 String.UTF16Index(range.location)
的功能。当我升级到 Xcode 9 时,导致错误 'init' is deprecated
.
所以在Xcode9中我改成了UTF16Index.init(encodedOffset: range.lowerBound)
。但是,现在这在 Xcode 8 中不起作用并出现错误 Argument labels '(encodedOffset:)' do not match any available overloads
.
即使我可以检查 Xcode 版本并编写不同的代码,其中一行也会在编译时失败。我该如何管理?还是我一直等到我们完全移动到 Xcode 9?
来自 Swift 文档中的 Version Compatibility:
NOTE
When the Swift 4 compiler is working with Swift 3 code, it identifies its language version as 3.2. As a result, you can use conditional compilation blocks like #if swift(>=3.2) to write code that’s compatible with multiple versions of the Swift compiler.
你的情况是
#if swift(>=3.2)
let idx = String.UTF16Index(encodedOffset: range.lowerBound)
#else
let idx = String.UTF16Index(range.location)
#endif
在Xcode9(Swift4或Swift3.2模式)只编译第一行,
在 Xcode 8 (Swift 3.1) 中只编译了第二行。
更新:encodedOffset
的使用是Swift中的considered harmful and will be deprecated 5.从Swift开始 4、正确将 NSRange
转换为 Range<String.Index>
的方法是
let str = "abc"
let nsRange = NSRange(location: 2, length: 1)
let sRange = Range(nsRange, in: str)
正如其他人所说,您可以进行 Swift 版本检查以调用正确的 API。但是如果你从多个地方调用它,那么定义一个 shim
可能会更容易
#if swift(>=3.2)
// already correct
#else
extension String.UTF16Index {
init(encodedOffset: Int) {
self.init(encodedOffset)
}
}
#endif
现在你可以只写 String.UTF16Index(encodedOffset: range.lowerBound)
并且在 Xcode 8 中它会调用你的 shim。
我所在的开发团队同时支持 Xcode 8 和 Xcode 9。
我正在开发一个在 Xcode 8 中使用 String.UTF16Index(range.location)
的功能。当我升级到 Xcode 9 时,导致错误 'init' is deprecated
.
所以在Xcode9中我改成了UTF16Index.init(encodedOffset: range.lowerBound)
。但是,现在这在 Xcode 8 中不起作用并出现错误 Argument labels '(encodedOffset:)' do not match any available overloads
.
即使我可以检查 Xcode 版本并编写不同的代码,其中一行也会在编译时失败。我该如何管理?还是我一直等到我们完全移动到 Xcode 9?
来自 Swift 文档中的 Version Compatibility:
NOTE
When the Swift 4 compiler is working with Swift 3 code, it identifies its language version as 3.2. As a result, you can use conditional compilation blocks like #if swift(>=3.2) to write code that’s compatible with multiple versions of the Swift compiler.
你的情况是
#if swift(>=3.2)
let idx = String.UTF16Index(encodedOffset: range.lowerBound)
#else
let idx = String.UTF16Index(range.location)
#endif
在Xcode9(Swift4或Swift3.2模式)只编译第一行, 在 Xcode 8 (Swift 3.1) 中只编译了第二行。
更新:encodedOffset
的使用是Swift中的considered harmful and will be deprecated 5.从Swift开始 4、正确将 NSRange
转换为 Range<String.Index>
的方法是
let str = "abc"
let nsRange = NSRange(location: 2, length: 1)
let sRange = Range(nsRange, in: str)
正如其他人所说,您可以进行 Swift 版本检查以调用正确的 API。但是如果你从多个地方调用它,那么定义一个 shim
可能会更容易#if swift(>=3.2)
// already correct
#else
extension String.UTF16Index {
init(encodedOffset: Int) {
self.init(encodedOffset)
}
}
#endif
现在你可以只写 String.UTF16Index(encodedOffset: range.lowerBound)
并且在 Xcode 8 中它会调用你的 shim。