繁体   English   中英

二元运算符“+”不能应用于“字符串”和“字符串?”类型的操作数

[英]Binary operator '+' cannot be applied to operands of type 'String' and 'String?'

编程新手,不太了解这是怎么回事,任何建议都值得赞赏。

func exercise() {
    let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]

    var char0 = alphabet.randomElement()
    var char1 = alphabet.randomElement()
    var char2 = alphabet.randomElement()
    var char3 = alphabet.randomElement()
    var char4 = alphabet.randomElement()
    var char5 = alphabet.randomElement()

    print(char0 + char1 + char2 + char3 + char4 + char5)
}

要理解的错误消息的重要部分是 String 和 String? (可选)被编译器认为是 2 种不同的类型。

在某些情况下,编译器可以进行(隐式)转换,因此类型相同但此处不一样,因为它无法转换 nil 并且 + 运算符仅适用于相同类型的两个变量/文字值。

考虑这种情况

var char0 = alphabet.randomElement()
var char1 = alphabet.randomElement() ?? ""

如果我们现在做print("0: \(char0) 1: \(char1)")两个变量的结果是完全不同的

0:可选(“p”)1:d

如果我们使用print("0: \(type(of: char0)) 1: \(type(of: char1))")检查他们的类型,我们也会看到

0:可选<字符串> 1:字符串

其他人已经解释了为什么您的代码会出错。 String.randomElement()返回一个Optional<String> ,这与 String 不同,您不能使用 + 连接 Optional。)

另一点:您的代码冗长且重复。 计算机科学中有一个原则“DRY”。 它代表“不要重复自己”。 任何时候,如果您一遍又一遍地使用相同的代码(可能会有细微的变化),这就是“代码异味”,也是改进的机会。

你可以像这样重写你的代码而不重复:

func exercise() {
    let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]

   var result = ""
   for _ in 1...6 {
     result.append(alphabet.randomElement() ?? "")
   }
   print(result)
}

在那个版本中,表达式alphabet.randomElement()只出现一次。 你不要重复自己。 它还使用?? “nil 合并运算符”将可能的 nil 结果转换为空白字符串。


处理它的另一种方法是定义+=运算符的覆盖,它允许您将 append 字符串选项转换为字符串:

public func +=(left: inout String, right: Optional<String>) {
    left = left + (right ?? "")
}

然后你的 function 变成:

func exercise() {
    let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
   var result = ""
   for _ in 1...6 {
    result += alphabet.randomElement()
   }
   print(result)
}

另一种方法是打乱您的源数组,获取前 6 个元素,然后将它们重新组合成一个字符串:

func exercise() {
    let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
    
    let result = alphabet
        .shuffled()[1...6]
        .joined()
    print(result)
}

通过使用为变量赋予默认值?? 运算符在 nil 的情况下。 它会改变String的变量类型吗? 到字符串

func exercise() {

    let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]

    var char0 = alphabet.randomElement() ?? ""
    var char1 = alphabet.randomElement() ?? ""
    var char2 = alphabet.randomElement() ?? ""
    var char3 = alphabet.randomElement() ?? ""
    var char4 = alphabet.randomElement() ?? ""
    var char5 = alphabet.randomElement() ?? ""

    print(char0 + char1 + char2 + char3 + char4 + char5)
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM