如何在Swift中将字符串/数组中的每个其他字母大写?

时间:2018-09-25 03:12:26

标签: arrays swift string for-loop

我正在尝试在Swift中将字符串中的每个偶数占位符大写。因此[0],[2],[4],[6]中的字符全部变为大写。

我有一个声明的变量:

var str = "This is a test" 

我有一个数组,将变量分解成数组:

let characters = Array(str) //Creates the array "["T", "h", "i", "s", " ", "i", "s", " ", "a", " ", "t", "e", "s", "t"]\n"

最重要的是,我正在创建一个空数组来输入新的大写/小写字母

var newCharacters = Array<Character>()

然后在0处声明索引

var index = 0 //declaring the index at 0

我试图弄清楚如何创建for循环,该循环将嗅出偶数数组项,然后大写其中的字符。

我创建了一个for循环,该循环将操作数组中偶数个占位符,我只是不知道将大写的其他字符串都大写的语法:

for letter in characters {

   if index % 2 == 0 {

     }

}

我试图弄清楚:将所有其他字母(数组中的偶数)大写,将它们放入新数组中,然后将其转换回字符串的语法是什么。

最终结果应该是:

"ThIs iS TeSt"

4 个答案:

答案 0 :(得分:3)

一种方法是使用stride

var str = "This is a test" 
var chars = Array(str).map { String($0) }
for i in stride(from: 0, to: chars.count, by: 2) {
  chars[i] = chars[i].uppercased()
}
var hiphopcasedStr = chars.joined()

请注意,当您使用Unicode时,某些字符大写到多字符字符串,因此Character的数组不太合适(因此转换为String的数组)。

答案 1 :(得分:3)

您可以依次组合enumeratedmapjoined来创建结果:

let str = "This is a test"

let result = str.enumerated()
                .map { $0.offset % 2 == 0 ? String($0.element).uppercased() : String($0.element) }
                .joined()

print(result)
ThIs iS A TeSt

说明:

  1. 可以将String枚举为Character的数组。在.enumerated()上调用String会使它产生一系列(offset: Int, element: Character)元组。
  2. map接受一个序列并创建一个数组。依次对序列中的每个元素调用map之后的闭包,闭包返回的值将成为新数组中的下一个元素。
  3. $0是传递给map的值的默认名称。在这种情况下,我们将传递(offset: Int, element: Character)元组。 $0.offset是字符在String中的位置,而$0.element是字符。
  4. 此处使用三元运算符返回uppercased()的{​​{1}}(如果偏移量为偶数),或者仅返回String(如果偏移量为奇数) 。
  5. Character的结果为String,然后使用map[String]的数组重新组合为单个joined()
  6. li>

答案 2 :(得分:0)

let str = "This is a test"
let result = str.indices.map {
                 str.distance(from: str.startIndex, to: $0) % 2 == 0 ?
                 str[$0...$0].uppercased() :
                 str[$0...$0].lowercased() }.joined()
print(result)   // "ThIs iS A TeSt\n"

或作为StringProtocol上的一种变异方法:

extension StringProtocol where Self: RangeReplaceableCollection {
    mutating func capitalizeEveryOther() {
        indices.forEach {
            replaceSubrange($0...$0, with:
                distance(from: startIndex, to: $0) % 2 == 0 ?
                self[$0...$0].uppercased() :
                self[$0...$0].lowercased() )
        }
    }
    var capitalizingEveryOther: Self {
        var result = self
        result.capitalizeEveryOther()
        return result
    }
}

var str5 = "This is a test"

str5.capitalizeEveryOther()

print(str5)     // ThIs iS A TeSt

答案 3 :(得分:0)

尝试此代码

int main(int argc, const char * argv[]) {

    char filepath[1000];
    printf("Enter the filepath of the Bakefile or bakefile: ");
    scanf("%s" , filepath);
    FILE* spData = fopen(filepath , "r");
    if (spData == NULL) {
        printf ("Cannot open file.");
        exit(EXIT_FAILURE);
    }
    replaceVariables(spData);

    fclose(spData);
    return 0;
}

结果

  

这是一个测试