Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何转换;索引“;输入“;Int";斯威夫特?_String_Swift - Fatal编程技术网

String 如何转换;索引“;输入“;Int";斯威夫特?

String 如何转换;索引“;输入“;Int";斯威夫特?,string,swift,String,Swift,我想将字符串中包含的字母索引转换为整数值。试图读取头文件,但我找不到索引的类型,尽管它似乎符合协议ForwardIndexType,并使用了方法(例如distanceTo) 感谢您的帮助。编辑/更新: Xcode 11•Swift 5.1或更高版本 extension StringProtocol { func distance(of element: Element) -> Int? { firstIndex(of: element)?.distance(in: self) }

我想将字符串中包含的字母索引转换为整数值。试图读取头文件,但我找不到
索引的类型,尽管它似乎符合协议
ForwardIndexType
,并使用了方法(例如
distanceTo

感谢您的帮助。

编辑/更新:

Xcode 11•Swift 5.1或更高版本

extension StringProtocol {
    func distance(of element: Element) -> Int? { firstIndex(of: element)?.distance(in: self) }
    func distance<S: StringProtocol>(of string: S) -> Int? { range(of: string)?.lowerBound.distance(in: self) }
}


编辑/更新:

Xcode 11•Swift 5.1或更高版本

extension StringProtocol {
    func distance(of element: Element) -> Int? { firstIndex(of: element)?.distance(in: self) }
    func distance<S: StringProtocol>(of string: S) -> Int? { range(of: string)?.lowerBound.distance(in: self) }
}



Swift 4

var str = "abcdefg"
let index = str.index(of: "c")?.encodedOffset // Result: 2
注意:如果字符串包含相同的多个字符,它将只获取从左到右最近的一个字符

var str = "abcdefgc"
let index = str.index(of: "c")?.encodedOffset // Result: 2

Swift 4

var str = "abcdefg"
let index = str.index(of: "c")?.encodedOffset // Result: 2
注意:如果字符串包含相同的多个字符,它将只获取从左到右最近的一个字符

var str = "abcdefgc"
let index = str.index(of: "c")?.encodedOffset // Result: 2

要执行基于索引的字符串操作,不能使用传统的索引数值方法。因为swift.index是由index函数检索的,它不是Int类型。即使字符串是一个字符数组,我们仍然不能按索引读取元素

这令人沮丧

所以,要为字符串的每个偶数字符创建新的子字符串,请检查下面的代码

let mystr = "abcdefghijklmnopqrstuvwxyz"
let mystrArray = Array(mystr)
let strLength = mystrArray.count
var resultStrArray : [Character] = []
var i = 0
while i < strLength {
    if i % 2 == 0 {
        resultStrArray.append(mystrArray[i])
      }
    i += 1
}
let resultString = String(resultStrArray)
print(resultString)
let mystr=“abcdefghijklmnopqrstuvxyz”
让mystrArray=Array(mystr)
让strLength=mystrArray.count
var resultStrArray:[字符]=[]
变量i=0
当我{
如果i%2==0{
resultStrArray.append(mystrArray[i])
}
i+=1
}
让resultString=String(resultStrArray)
打印(结果字符串)
输出:acegikmoqsuwy


提前感谢

基于索引执行字符串操作,您无法使用传统的索引数值方法来执行此操作。因为swift.index是由index函数检索的,它不是Int类型。即使字符串是一个字符数组,我们仍然不能按索引读取元素

这令人沮丧

所以,要为字符串的每个偶数字符创建新的子字符串,请检查下面的代码

let mystr = "abcdefghijklmnopqrstuvwxyz"
let mystrArray = Array(mystr)
let strLength = mystrArray.count
var resultStrArray : [Character] = []
var i = 0
while i < strLength {
    if i % 2 == 0 {
        resultStrArray.append(mystrArray[i])
      }
    i += 1
}
let resultString = String(resultStrArray)
print(resultString)
let mystr=“abcdefghijklmnopqrstuvxyz”
让mystrArray=Array(mystr)
让strLength=mystrArray.count
var resultStrArray:[字符]=[]
变量i=0
当我{
如果i%2==0{
resultStrArray.append(mystrArray[i])
}
i+=1
}
让resultString=String(resultStrArray)
打印(结果字符串)
输出:acegikmoqsuwy


提前感谢
encodedOffset
已从Swift 4.2中弃用

弃用消息:
encodedOffset
已被弃用,因为最常见的用法不正确。使用
utf16Offset(in:)
实现相同的行为

因此,我们可以像这样使用
utf16Offset(in:)

var str = "abcdefgc"
let index = str.index(of: "c")?.utf16Offset(in: str) // Result: 2

encodedOffset
已从Swift 4.2弃用

弃用消息:
encodedOffset
已被弃用,因为最常见的用法不正确。使用
utf16Offset(in:)
实现相同的行为

因此,我们可以像这样使用
utf16Offset(in:)

var str = "abcdefgc"
let index = str.index(of: "c")?.utf16Offset(in: str) // Result: 2
这将允许您以
Int
s而不是
String的形式访问子字符串的边界。Index
值:

<代码>导入基础 ///此分机可在 /// https://gist.github.com/zackdotcomputer/9d83f4d48af7127cd0bea427b4d6d61b 扩展字符串协议{ ///以整数索引的形式访问搜索字符串的范围 ///在渲染的字符串中。 ///-注意:这是“不安全”的,因为如果 ///字符串包含由多个标量组成的单个符号。 ///-返回:一个与Swift String.Index对齐的'CountableRange' ///从标准函数范围(of:)的结果。 func可数范围( 搜索类型:SearchType, 选项:String.CompareOptions=[], 范围:范围?=零, 语言环境:语言环境?=nil )->可数范围{ guard let trueRange=self.range(of:search,options:options,range:range,locale:locale)else{ 归零 } 让intStart=self.distance(从:startIndex到:trueRange.lowerBound) 让intential=self.distance(从:trueRange.lowerBound到:trueRange.upperBound)+intStart 返回范围(未选中边界:(下:intStart,上:intent)) } }
请注意,这可能会导致奇怪,这就是为什么苹果选择让它变得困难的原因。(尽管这是一个有争议的设计决策——通过使其变得困难来隐藏危险的东西…)

您可以在中阅读更多内容,但tldr是因为这些“索引”实际上是特定于实现的。它们在操作系统呈现字符串后将索引表示为字符串,因此可以根据所使用的Unicode规范版本从一个操作系统切换到另一个操作系统。这意味着通过索引访问值不再是一个固定时间操作,因为必须在数据上运行UTF规范以确定字符串中的正确位置。如果您连接到NSString,这些索引也不会与NSString生成的值对齐,或者与底层UTF标量中的索引对齐。开发者须知。

这将允许您以
Int
s而不是
String的形式访问子字符串的边界。Index
值:

<代码>导入基础 ///此分机可在 /// https://gist.github.com/zackdotcomputer/9d83f4d48af7127cd0bea427b4d6d61b 扩展字符串协议{ ///以整数索引的形式访问搜索字符串的范围 ///在渲染的字符串中。 ///-注意:这是“不安全”的,因为如果 ///字符串包含由多个标量组成的单个符号。 ///-返回:一个与Swift String.Index对齐的'CountableRange' ///从标准函数范围(of:)的结果。 func可数范围( 搜索类型:SearchType, 选项:Stri
⛔️ guard let index = (positions.firstIndex { position <= $0 }) else {
✅ guard let index: Int = (positions.firstIndex { position <= $0 }) else {
let myString = "Hello World"

if let i = myString.firstIndex(of: "o") {
  let index: Int = myString.distance(from: myString.startIndex, to: i)
  print(index) // Prints 4
}