交换字符串案例 - 迅捷

时间:2015-01-31 19:36:59

标签: string cocoa swift

let str = "tHIS is A test"
let swapped_case = "This IS a TEST"

Swift noob在这里,如何以编程方式完成第二个语句?

6 个答案:

答案 0 :(得分:5)

此函数适用于所有大写/小写字符 以Unicode定义,甚至是来自“外国”语言的那些语言,例如Ä或ć:

func swapCases(_ str : String) -> String {
    var result = ""
    for c in str.characters { // Swift 1: for c in str {
        let s = String(c)
        let lo = s.lowercased() //Swift 1 & 2: s.lowercaseString
        let up = s.uppercased() //Swift 1 & 2: s.uppercaseString
        result += (s == lo) ? up : lo
    }
    return result
}

示例:

let str = "tHIS is a test ÄöÜ ĂćŒ Α" // The last character is a capital Greek Alpha
let swapped_case = swapCases(str)
print(swapped_case)
// This IS A TEST äÖü ăĆœ α

答案 1 :(得分:2)

使用switch语句范围内检查来确定字母大小写,并使用NSString - 桥接方法进行相应的转换。

let str = "tHIS is A test"
let swapped_case = "This IS a TEST"

func swapCase(string: String) -> String {
    var swappedCaseString: String = ""
    for character in string {
        switch character {
        case "a"..."z":
            let uppercaseCharacter = (String(character) as NSString).uppercaseString
            swappedCaseString += uppercaseCharacter
        case "A"..."Z":
            let lowercaseCharacter = (String(character) as NSString).lowercaseString
            swappedCaseString += lowercaseCharacter
        default:
            swappedCaseString += String(character)
        }
    }

    return swappedCaseString
}

swapCase(str)

答案 2 :(得分:1)

我有点太晚了,但这也有效: - )

let str = "tHIS is A test"
var res = ""
for c in str {
  if contains("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c) {
    res += "\(c)".lowercaseString
  } else {
    res += "\(c)".uppercaseString
  }
}
res

答案 3 :(得分:0)

你已经有了很多简洁明了的答案,但这里有一个过于精致的答案。

实际上这是map的工作 - 遍历集合(在本例中为String)并对每个元素(此处为每个字符)执行操作。除了map接受任何集合,但只返回一个数组,然后你必须再将它变成一个字符串。

但是这里是map的一个版本,给定一个可扩展的集合,可以返回相同类型的可扩展集合。

(它确实有两个集合需要包含相同类型的限制,但这对于字符串来说很好。你可以让它返回一个不同的类型,但是你必须告诉它你想要哪种类型,即{{ 1}}这会很烦人)

map(s, transform) as String

然后编写转换函数,首先这里是与其他答案类似的字符扩展。你必须转换为字符串只是为了大写一个字符似乎是非常不满意的,是否真的没有好的(国际字符友好)方式来做到这一点?

func map<C: ExtensibleCollectionType>(source: C, transform: (C.Generator.Element) -> C.Generator.Element) -> C {
    var result = C()

    for elem in source {
        result.append(transform(elem))
    }

    return result
}

翻转案例的功能。我想知道这种模式匹配是否对国际友好。似乎是 - extension Character { var uppercaseCharacter: Character { let s = String(self).uppercaseString return s[s.startIndex] } var lowercaseCharacter: Character { let s = String(self).lowercaseString return s[s.startIndex] } } 返回true。

"A"..."Z" ~= "Ä"

最后:

func flipCase(c: Character) -> Character {
    switch c {
    case "A"..."Z":
        return c.lowercaseCharacter
    case "a"..."z":
        return c.uppercaseCharacter
    default:
        return c
    }
}

答案 4 :(得分:0)

我希望这会有所帮助。 inputString和resultString分别是输入和输出。

let inputString = "Example"

let outputString = inputString.characters.map { (character) -> Character in
    let string = String(character)
    let lower = string.lowercased()
    let upper = string.uppercased()
    return (string == lower) ? Character(upper) : Character(lower)
}

let resultString = String(outputString)

答案 5 :(得分:0)

在 Swift 5 中,我通过创建一个遍历字符串的每个字符的函数,并使用字符串方法更改每个字符来实现它,我将每个字符附加回一个新变量:

func reverseCase(string: String) -> String {
    var newCase = ""
    for char in string {
        if char.isLowercase {
            newCase.append(char.uppercased())
        }
        else if char.isUppercase {
            newCase.append(char.lowercased())
        }
        else {
            newCase.append(char)
        }
    }
    return newCase
}

然后,当您在打印语句中调用它时,只需将您的字符串传递给该函数:

print(reverseCase(string: str))