可以将字符串转换为大写,不包括Swift中的某些单词吗?

时间:2016-06-08 14:59:31

标签: string swift

我想将字符串转换为Title案例,但不包括一些不需要更改的字词,作为产品,服务和其他商标名称的名称。

使用此代码:

var storyTtitle = "Presented the new PowerBook"
let newStr = str.capitalizedStringWithLocale(NSLocale.currentLocale())

这里的结果是:“提出新的Powerbook”,不幸的是改变了“Powerbook”这个词,在这种情况下,这是一个错误。有没有人知道是否有办法排除某些单词,可能包含在列表中?

2 个答案:

答案 0 :(得分:2)

我希望这会有所帮助。有一些不同的函数可用于大写字符串。我想这就是你想要的。

var storyTtitle: String = "Presented the new PowerBook"
var newStr: String = ""

var listToExclude: [String] = ["PowerBook"]

var stringArray: [String] = storyTtitle.componentsSeparatedByString(" ")

for str in stringArray {
    for excludeStr in listToExclude {
        if !str.containsString(excludeStr) {
            newStr.appendContentsOf(str.localizedCapitalizedString)
            if str != stringArray.last {
                newStr.appendContentsOf(" ")
            }
        }
    }
}
print(newStr)

答案 1 :(得分:2)

您可以enumerateSubstringsInRange()使用.ByWords 用于枚举字符串中所有单词的选项。这具有优势 即使单词没有分隔,它也能正常工作 空间人物。

您的想法来自上述评论

  

已经包含大写字母的单词(例如iPhone,OS X,Xcode,MacBook,iOS)不会更改,而所有不包含任何大写字母的单词都可能会发生变化

然后可以像这样实现:

let storyTtitle = "Presented 'the' new PowerBook!  (or iPhone?)"

var newTitle = storyTtitle
var offset = 0
storyTtitle.enumerateSubstringsInRange(storyTtitle.characters.indices, options: .ByWords) {
    (substring, substringRange, _, _) in
    if let oldString = substring where oldString == oldString.lowercaseString {
        let range = substringRange.startIndex.advancedBy(offset) ..< substringRange.endIndex.advancedBy(offset)
        let newString = oldString.capitalizedString
        newTitle.replaceRange(range, with: newString)
        offset += newString.characters.count - oldString.characters.count
    }
}

print(newTitle)
// Presented 'The' New PowerBook!  (Or iPhone?)

offset变量和“复杂”范围计算 必要的,因为字符串的大写版本没有 必须与小写版本具有相同数量的字符。 例如,在德语中,"ß"的大写字符串为"SS"