Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 它';除了Swift中的某些单词外,是否可以将字符串转换为大写?_String_Swift - Fatal编程技术网

String 它';除了Swift中的某些单词外,是否可以将字符串转换为大写?

String 它';除了Swift中的某些单词外,是否可以将字符串转换为大写?,string,swift,String,Swift,我想将字符串转换为标题大小写,但不包括一些不需要更改的单词,如产品、服务和其他商标名称 使用此代码: var storyTtitle = "Presented the new PowerBook" let newStr = str.capitalizedStringWithLocale(NSLocale.currentLocale()) 这里的结果是:“呈现了新的Powerbook”,不幸的是更改了“Powerbook”一词,在这种情况下,这是一个错误。有人知道有没有办法排除某些单词,可能包含

我想将字符串转换为标题大小写,但不包括一些不需要更改的单词,如产品、服务和其他商标名称

使用此代码:

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

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

我希望这能有所帮助。有几个不同的函数用于将字符串大写。我想这就是你想要的

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)

您可以将
EnumerateSubstringsRange()
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?)
let storytitle=“展示”新的PowerBook!(或iPhone?)
var newTitle=故事情节
var偏移量=0
Storytitle.EnumerateSubstringsRange(Storytitle.characters.Index,选项:。ByWords){
(子字符串,子字符串范围,,)in
如果让oldString=substring,其中oldString==oldString.lowercasesetring{
让range=substringRange.startIndex.advancedBy(偏移量)…
偏移量
变量和“复杂”范围计算 必需,因为字符串的大写版本不是 必须具有与小写版本相同的字符数。
例如,在德语中,
“ß”
的大写字符串是
“SS”

Mm,它不完全相同。将一个可以包含许多单词的字符串大写,并根据区域设置进行操作,这与将单个单词大写不同。谢谢Sethmr。不幸的是,您的代码打印的是“Presented The New”,实际上它应该是:“Presented The New PowerBook”。这是因为PowerBook在我的示例中被排除在外。啊,好的,我明白了。谢谢。你真的想要一个排除列表,还是只想大写首字母,而保持其余字符不变?嗨,maddy,我考虑过了,如果可能的话,最好不要使用排除列表。然后进一步提出你的理由,也许有一种不用它的方式:已经包含大写字母的单词(如iPhone、OS X、Xcode、MacBook、iOS)不会更改,而所有不包含大写字母的单词都可能更改。真正出色的马提尼注意到一个小烦恼:“1970年代”成为“70年代”,你认为有办法避免吗?@Tel:说得对。不幸的是,我目前没有一个好主意。