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

时间:2017-07-24 09:45:21

标签: swift string substring

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

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

我喜欢这样做......

let string = someInputString
    .someGeneratorFunctionThatReturnsAString()
    .substring(to: 10)

但我无法做到这一点。因为substring函数中的索引需要字符串本身来确定第10个字符的位置。

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

2 个答案:

答案 0 :(得分:3)

我可能只是理解你的问题是错误的,但在这里你可以很容易地解决问题:

extension String {
    func substring(to: Int) -> String? {
        return self.substring(to: self.index(self.startIndex, offsetBy: to))
    }
} 

答案 1 :(得分:1)

请参阅Gunhan对问题2的回答。

问题1:

长答案:基本上,在Swift中,Collection协议(类似于Array和String的类型)指定了性能标准。最值得注意的是,集合的开始和结束索引必须在 O (1)时间内可访问。这也适用于元素的下标访问(请参阅https://developer.apple.com/documentation/swift/collection预期效果标题下的文字)。

索引是指向另一个引用或值类型的内存地址。对于字符串,索引指向Character结构值。虽然字符串let x = "hello"let y = "hello"中字符的可能相同,但常量xy是不同的内存地址,指数也指向各自的Character结构值。所以,你不能从"llo"得到子串x而从"llo"得到子串y使用相同的索引...这没有任何意义,因为你会得到索引use只是那些变量的特定内存地址。

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

String |--hasIndicesOfType--> String.Index |--whichPointTo--> Character

(旁注:此处,Indexassociatedtype上的String,这就是为什么你会看到符号String.Index,如果你要记录其中一个这些到Xcode控制台)。

简而言之为什么函数需要字符串本身的答案是因为字符串的索引是字符串字符的内存地址。 String符合Collection以获取 O (1)访问String元素的效果。因此,指数。因为索引是内存地址,所以它们只能处理给定的对象(引用类型) - 这就是为什么对字符串字符的泛型访问仅适用于一个字符串(即,您无法访问字符串A的元素,其内存地址为字符串B的字符。那没有意义。)

简而言之:因为String符合Collection

一些有用的教程代码:

目的论为什么 String背后的明显的最终目标推理(又名teleological分析)是它在Swift中的方式:< / p>

该语言的参与者首选优化time complexity优于space complexity