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 为什么我需要字符串来确定第n个字符的索引?_Swift_String_Substring - Fatal编程技术网

Swift 为什么我需要字符串来确定第n个字符的索引?

Swift 为什么我需要字符串来确定第n个字符的索引?,swift,string,substring,Swift,String,Substring,我想得到一个字符串的子字符串,它只是前N个字符。(例如,10) 但是字符串是函数的生成输出 我想这样做 let string = someInputString .someGeneratorFunctionThatReturnsAString() .substring(to: 10) 但我不能这么做。因为子字符串函数中的索引需要字符串本身来确定第10个字符的位置 第一个问题。。。为什么会这样 第二个问题。。。如何在不需要原始字符串来获取索引的情况下获取这样的子字符串 我可能理

我想得到一个字符串的子字符串,它只是前N个字符。(例如,10)

但是字符串是函数的生成输出

我想这样做

let string = someInputString
    .someGeneratorFunctionThatReturnsAString()
    .substring(to: 10)
但我不能这么做。因为子字符串函数中的索引需要字符串本身来确定第10个字符的位置

  • 第一个问题。。。为什么会这样
  • 第二个问题。。。如何在不需要原始字符串来获取索引的情况下获取这样的子字符串

我可能理解错了您的问题,但在这里,您可以轻松地替换:

extension String {
    func substring(to: Int) -> String? {
        return self.substring(to: self.index(self.startIndex, offsetBy: to))
    }
} 
请参见作者对问题2的回答

关于问题1:

长答案:基本上,在Swift中,协议(数组和字符串等类型采用)指定了性能标准。最值得注意的是,集合的开始索引和结束索引必须在O(1)时间内可访问。这也适用于元素的下标访问(请参阅上标题预期性能下的文本)

索引是指向其他引用或值类型的内存地址。对于字符串,索引指向
字符
结构值。虽然字符串
let x=“hello”
let y=“hello”
中的字符值可能相同,但常量
x
y
是不同的内存地址,指向各自
字符的索引也是不同的结构值。因此,无法使用相同的索引从
x
获取子字符串
“llo”
,从
y
获取子字符串
“llo”
。。。这是没有意义的,因为您将使用的索引是只针对这些变量的特定内存地址

在架构上,这里有三个实体相互作用:

String |--hassindesoftype-->String.Index |--指向-->字符

(旁注:这里,
Index
String
上的
associatedtype
,这就是为什么您会看到符号
String.Index
,如果您要将其中一个记录到Xcode控制台)

简而言之:函数为什么需要字符串本身的答案是因为字符串的索引是字符串字符的内存地址<代码>字符串
符合
集合
,以在访问
字符串
的元素时获得O(1)性能。因此,这些指数是合理的。因为索引是内存地址,所以它们只对给定对象(引用类型)起作用-这就是为什么对字符串中的字符的一般访问只对一个字符串起作用(也就是说,不能使用内存地址访问字符串a的元素,而访问字符串B的字符…这是没有意义的)

简而言之:因为
字符串
符合
集合

一些有用的教程代码:

  • (极力推荐这本书)
目的论:为什么
字符串
是Swift中的一种方式,其背后有明显的最终目标推理(又称分析):


语言的贡献者更倾向于优化。

从我所了解的情况来看,大致是这样的:Swift中的字符串在内部存储为UTF-8,因此不可能进行随机访问(字符的字节长度可变),因此有一种称为“索引”的东西您创建一个特定的字符串,并通过向前或向后移动整数位数(按顺序)进行修改,它们只对该字符串有效。@NicolasMiari:实际上字符串在内部使用ASCII或UTF-16,但这是一个实现细节,将来可能会更改。@NicolasMiari:不太可能。但是
字符
是一个“扩展的图形集簇”,由一个或多个unicode标量组成。@Fogmeister:这里有一个简单的解决方案:。@Fogmeister看到了吗?我在胡说八道,听那些知道的人说!是的,我也创建了一个这样的扩展。我只是想知道为什么需要绳子。谢谢:D