首页 > 解决方案 > 范围与字符串索引

问题描述

我在理解 Range-String.Index- 和 String.Index 之间的区别时遇到问题

例如:

func returnHtmlContent() -> String {
    let filePath = URL(string:"xxx.htm")
    filePath?.startAccessingSecurityScopedResource();
    let htmlFile = Bundle.main.path(forResource: "getData", ofType: "htm");
    let html = try! String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8);
    filePath?.stopAccessingSecurityScopedResource();
    return html;
};
func refactorHtml(content: String) -> String {
    let StartingString = "<div id=\"1\">";
    let EndingString   = "</div></form>";

    func selectString() -> String {
        var htmlContent = returnHtmlContent();
        let charLocationStart = htmlContent.range(of: StartingString);
        let charLocationEnd   = htmlContent.range(of: EndingString);

        htmlContent.remove(at: charLocationStart);
        return htmlContent;
    };
    let formattedBody = selectString();
    return formattedBody;
};
refactorHtml(content: returnHtmlContent());

伪代码中的想法

Generated HTMLBody
Pass To Function that formats
Remove all characters before StartingString
Remove all Characters After EndingString
Send NewString to Variable

现在 - 当我试图找到索引位置时,我似乎无法获得正确的值类型,这是我得到的错误

Cannot convert value of type 'Range<String.Index>?' to expected argument type 'String.Index'

这是在操场上跑步

标签: swiftswift-playground

解决方案


字符串索引不是整数。它们是不透明的对象(类型为String.Index),可用于下标 String 以获得字符。

范围不仅限于Range<Int>. 如果您查看 的声明Range,您可以看到它对任何 都是通用的Bound,只要BoundComparable(即String.Index)。

所以aRange<String.Index>就是这样。它是一个字符串索引范围,就像任何其他范围一样,它有一个lowerBound和一个upperBound


推荐阅读