在Swift中,如何修改带下标的字符串中的字符?
就像在C中一样,我们可以简单地在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[
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.)