簡體   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