Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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
在Swift中,如何修改带下标的字符串中的字符?_Swift_String - Fatal编程技术网

在Swift中,如何修改带下标的字符串中的字符?

在Swift中,如何修改带下标的字符串中的字符?,swift,string,Swift,String,就像在C中一样,我们可以简单地 str[i] = str[j] 但如何在swift中编写类似的逻辑? 这是我的代码,但出现错误: 无法通过下标进行分配:下标是get only let indexI = targetString.index(targetString.startIndex, offsetBy: i) let indexJ = targetString.index(targetString.startIndex, offsetBy: j) targetString[

就像在C中一样,我们可以简单地

str[i] = str[j]
但如何在swift中编写类似的逻辑? 这是我的代码,但出现错误: 无法通过下标进行分配:下标是get only

let indexI = targetString.index(targetString.startIndex, offsetBy: i)
let indexJ = targetString.index(targetString.startIndex, offsetBy: j)        
targetString[indexI] = targetString[indexJ]
我知道用这种方法可能行得通,但太不方便了

replaceSubrange(, with: )

使用Swift处理
String
是a**中的一大难题。与我所知道的大多数将字符串视为字符数组的语言不同,Swift将字符串视为扩展的图形集簇的集合,访问它们的API非常笨拙。但那份宣言在我的文章中丢失了大约10段

回到你的问题上来。。。您可以这样替换角色:

var targetString = "Hello world"
let i = 0
let j = 1

let indexI = targetString.index(targetString.startIndex, offsetBy: i)
let indexJ = targetString.index(targetString.startIndex, offsetBy: j)

targetString.replaceSubrange(indexI...indexI, with: targetString[indexJ...indexJ])

print(targetString) // eello world

使用Swift处理
String
是a**中的一大难题。与我所知道的大多数将字符串视为字符数组的语言不同,Swift将字符串视为扩展的图形集簇的集合,访问它们的API非常笨拙。但那份宣言在我的文章中丢失了大约10段

回到你的问题上来。。。您可以这样替换角色:

var targetString = "Hello world"
let i = 0
let j = 1

let indexI = targetString.index(targetString.startIndex, offsetBy: i)
let indexJ = targetString.index(targetString.startIndex, offsetBy: j)

targetString.replaceSubrange(indexI...indexI, with: targetString[indexJ...indexJ])

print(targetString) // eello world
在C语言中,字符串(
char*
)可以被视为字符数组。在Swift中,您可以将
字符串
转换为
[字符]
,进行所需的修改,然后将
[字符]
转换回
字符串

例如:

let str = "hello"    
var strchars = Array(str)    
strchars[0] = strchars[4]    
let str2 = String(strchars)
print(str2) // "oello"
对于单个修改来说,这似乎需要大量的工作,但是如果您以这种方式移动多个字符,则每个方向只需转换一次


反转字符串

下面是一个简单的反转字符串算法的示例。通过首先转换为字符数组,此算法类似于在C中执行此操作的方式:

let str = "abcdefg"
var strchars = Array(str)

var start = 0
var end = strchars.count - 1

while start < end {
    let temp = strchars[start]
    strchars[start] = strchars[end]
    strchars[end] = temp
    start += 1
    end -= 1
}

let str2 = String(strchars)
print(str2)  // "gfedcba"
let str=“abcdefg”
var strchars=数组(str)
var start=0
var end=strchars.count-1
当开始<结束{
让温度=标准卡[开始]
strchars[start]=strchars[end]
strchars[结束]=温度
开始+=1
结束-=1
}
设str2=String(strchars)
打印(str2)/“gfedcba”
在C语言中,字符串(
char*
)可以被视为字符数组。在Swift中,您可以将
字符串
转换为
[字符]
,进行所需的修改,然后将
[字符]
转换回
字符串

例如:

let str = "hello"    
var strchars = Array(str)    
strchars[0] = strchars[4]    
let str2 = String(strchars)
print(str2) // "oello"
对于单个修改来说,这似乎需要大量的工作,但是如果您以这种方式移动多个字符,则每个方向只需转换一次


反转字符串

下面是一个简单的反转字符串算法的示例。通过首先转换为字符数组,此算法类似于在C中执行此操作的方式:

let str = "abcdefg"
var strchars = Array(str)

var start = 0
var end = strchars.count - 1

while start < end {
    let temp = strchars[start]
    strchars[start] = strchars[end]
    strchars[end] = temp
    start += 1
    end -= 1
}

let str2 = String(strchars)
print(str2)  // "gfedcba"
let str=“abcdefg”
var strchars=数组(str)
var start=0
var end=strchars.count-1
当开始<结束{
让温度=标准卡[开始]
strchars[start]=strchars[end]
strchars[结束]=温度
开始+=1
结束-=1
}
设str2=String(strchars)
打印(str2)/“gfedcba”

swift使字符串索引变得如此复杂,这一事实也让我相当震惊。因此,我构建了一些字符串扩展,使您能够基于索引、闭合范围和开放范围、PartialRangeFrom、PartialRangeThrough和PartialRangeUpTo检索和更改字符串的部分。您可以下载我创建的存储库

您还可以传入负数以便从末尾向后访问字符

公共扩展字符串{
/**
允许传入负索引以访问字符
从结尾开始,然后向后走。
如果num为负数,则将其添加到
用于检索真实索引的字符串的长度。
*/
函数负索引(num:Int)->Int{
返回num<0?num+self.count:num
}
func strOpenRange(索引i:Int)->范围{
设j=负指数(i)
返回选通量程(j..量程{
var lower=范围.lowerBound
var上限=范围上限
如果选择否定{
下限=负指数(下限)
上限=负指数(上限)
}
设idx1=索引(self.startIndex,offsetBy:lower)
设idx2=索引(self.startIndex,offsetBy:upper)
返回idx1..ClosedRange{
var lower=范围.lowerBound
var上限=范围上限
如果选择否定{
下限=负指数(下限)
上限=负指数(上限)
}
让开始=self.index(self.startIndex,offsetBy:lower)
让结束=自索引(开始,偏移:上-下)
返回开始…结束
}
//标记:-下标
/**
获取并设置给定索引处的字符。
将负索引添加到长度中,以便
可以从末尾向后访问字符
用法:`string[n]`
*/
下标(i:Int)->字符串{
得到{
返回字符串(self[strOpenRange(索引:i)])
}
设置{
let range=strOpenRange(索引:i)
replaceSubrange(范围,带:newValue)
}
}
/**
获取和设置开放范围中的字符。
支持负索引。
用法:`string[n..string{
得到{
返回字符串(self[strOpenRange(r)])
}
设置{
replaceSubrange(strOpenRange(r),带:newValue)
}
}
/**
获取和设置封闭范围内的字符。
支持负索引
用法:`string[n…n]`
*/
下标(r:CountableClosedRange)->字符串{
得到{
返回字符串(self[strClosedRange(r)])
}
设置{
replaceSubrange(strClosedRange(r),带:newValue)
}
}
///`string[n..]`。请参阅PartialRangeFrom
下标(r:PartialRangeFrom)->字符串{
得到{
返回字符串(self[strOpenRange(r.lowerBound.)