如果给定Substring,是否可以访问它所基于的底层完整字符串?

时间:2018-03-11 05:22:51

标签: swift range substring swift4

说我有以下代码......

let x = "ABCDE"
// 'x' is a String

var y = x[1...3]
// 'y' is a Substring that equals "BCD"

如果您只能访问y,是否可以访问x范围之外的xy部分内容? (即您可以访问“A”或“E”,还是增加y的范围?)

1 个答案:

答案 0 :(得分:1)

所以这就是Apple所说的:

  

重要

     

不要存储超过您需要的子字符串来执行特定的子字符串   操作。子字符串包含对整个存储的引用   字符串它来自,而不仅仅是它所呈现的部分,即使是   原始字符串没有其他引用。存储子串   因此,可能会延长不再使用的字符串数据的生命周期   否则可以访问,这可能看起来是内存泄漏。

现在我发现他们在最后一句中使用“否则”这个词相当有趣。在我看来,在这个问题上保持开门 - 是否可以操纵子串扩展为包括我们知道仍然作为原始字符串的一部分存在的任何一侧的内存?

所以我认为这是一个公平的考验:

let x = "ABCDEFGH"

let substr = x.prefix(3)
var substrIndex = substr.startIndex
substr.formIndex(&substrIndex, offsetBy: 4)  // offset beyond the substring
let prefix = substr.prefix(through:substrIndex)
print(prefix)

那么我认为会打印什么? 实际上我们从来没有打印过。我们得到了运行时致命错误。

Thread 1: Fatal error: Operation results in an invalid index

BTW,即使尝试以下结果导致EXC_BAD_ACCESS崩溃:

let x = "ABCDEFGH"

var substr = x.prefix(3)
withUnsafePointer(to: &substr)
    { substrPointer in
        let z = substrPointer.advanced(by: 3)
        print(z.pointee)
    }

所以我认为如果你只是从Substring或String类中有一个子字符串,或者甚至处理不安全的指针,那么就没有办法找到字符串的其余部分。我确信有一种方法可以使用直接内存访问,因为Apple声称其余的String内存都存在......但你可能不得不回归到C或C ++。