我想获得一个字符串的子字符串,它只是前N个字符。 (例如,10)。
但字符串是函数的生成输出。
我喜欢这样做......
let string = someInputString
.someGeneratorFunctionThatReturnsAString()
.substring(to: 10)
但我无法做到这一点。因为substring函数中的索引需要字符串本身来确定第10个字符的位置。
答案 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"
中字符的值可能相同,但常量x
和y
是不同的内存地址,指数也指向各自的Character
结构值。所以,你不能从"llo"
得到子串x
而从"llo"
得到子串y
使用相同的索引...这没有任何意义,因为你会得到索引use只是那些变量的特定内存地址。
在架构上,这里有三个实体相互作用:
String |--hasIndicesOfType--> String.Index |--whichPointTo--> Character
(旁注:此处,Index
是associatedtype
上的String
,这就是为什么你会看到符号String.Index
,如果你要记录其中一个这些到Xcode控制台)。
简而言之:为什么函数需要字符串本身的答案是因为字符串的索引是字符串字符的内存地址。 String
符合Collection
以获取 O (1)访问String
元素的效果。因此,指数。因为索引是内存地址,所以它们只能处理给定的对象(引用类型) - 这就是为什么对字符串字符的泛型访问仅适用于一个字符串(即,您无法访问字符串A的元素,其内存地址为字符串B的字符。那没有意义。)
简而言之:因为String
符合Collection
。
一些有用的教程代码:
目的论:为什么 String
背后的明显的最终目标推理(又名teleological分析)是它在Swift中的方式:< / p>
该语言的参与者首选优化time complexity优于space complexity。