在 Swift 4 中限制 JSON 响应



似乎是一个菜鸟问题,但我收到了来自维基百科API的回复,有时,根据请求是什么,图像描述的响应太长了。这就是我对这个特定请求的要求。

let imageDescription = imageJSON["query"]["pages"][pageid]["extract"].stringValue

我想把它限制在50个字以内。有什么建议吗?

执行此操作的一种简单方法是将字符串分解为一个单独的单词数组,将数组限制为 50 个项目,然后将数组重新组合在一起。 您可以像这样实现这一点:

var imageDescription = imageJSON["query"]["pages"][pageid]["extract"].stringValue
imageDescription = imageDescription.components(separatedBy: " ").prefix(50).joined(separator: " ")

不要用空格或标点符号来分割字符串以获得单词。某些语言(如中文和日语(不按空格分隔单词。有关详细信息,请参阅此文章。

func takeFirst(words wordCount: Int, in str: String) -> String {
    let fullRange = str.startIndex..<str.endIndex
    var count = 0
    var substr: Substring = ""
    str.enumerateSubstrings(in: fullRange, options: .byWords) { _, _, enclosingRange, stop in
        count += 1
        if enclosingRange.upperBound == fullRange.upperBound || count >= wordCount {
            substr = str[str.startIndex..<enclosingRange.upperBound]
            stop = true
        }
    }
    return String(substr)
}
let imageDescription = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed pulvinar semper sapien, sit amet feugiat risus pulvinar a. Sed in aliquam sem. Nullam lacinia sagittis ipsum, et congue lectus pulvinar quis. Vestibulum elementum mattis feugiat. Nam velit elit, facilisis non ipsum vel, ornare aliquam velit. Curabitur hendrerit ante sed odio porttitor, pellentesque molestie sapien eleifend. Etiam porttitor fermentum egestas. Cras dui justo, vulputate non porta sed, congue eu lacus."
let shortImageDescription = takeFirst(words: 5, in: imageDescription)
print(shortImageDescription)

另一个中文例子来说明这一点:

let imageDescription = "今天你好吗?" // first two characters form one word: "today"
                                    // third character is its own word: "you"
                                    // fourth chasracter is its own word: "well"
                                    // fifth character is its own word" "huh"
let shortImageDescription = takeFirst(words: 3, in: imageDescription) // 今天你好

最新更新