2017-07-11 93 views
-1

我讀過Non-optional shown as optional on print但這並沒有幫助我的問題。爲什麼將非可選值打印爲可選值?

我返回一個Integer,但是一旦它打印出來,它就會被打印爲可選項。爲什麼?

我正試圖解決代碼挑戰。我們的目標是:

寫出返回一個特定的數字出現在任何數量的次數 整數集合的擴展。

這是我實現:

extension Collection where Iterator.Element == Int { 
    func challenge37(count character : Character) -> Int?{ 

     guard nil != Int(String(character)) else{ 
      print("character wasn't an integer") 
      return nil 
     } 

     var counts : [Int] = [] 
     for item in self{ 
      var counter = 0 
      let stringInt = String(describing: item) 

      for currentCharacter in stringInt.characters{ 
       if character == currentCharacter{ 
        counter += 1 
       } 
      } 
      counts.append(counter) 
     } 
     guard let min = counts.min() else{ 
      print("no min") 
      return nil 
     } 

     return min 
    } 
} 

正如你可以在這裏看到我打印出來:

print([5,15,512,522].challenge37(count: "5")) // Optional(1) 
+0

儘管鏈接的問題似乎非常相關,但OP的混淆是由於不注意*可選*返回類型 – Honey

+1

鏈接的問題是關於隱式解包的選項的字符串插值,所以我不認爲是非常相關的。 - 在你的情況下,你有一個返回'Int?'的函數,並將其打印爲可選項,所以我想知道爲什麼它根本不清楚(或值得自己回答的問題)。 –

+0

@MartinR'return min'行被解包,新手可能認爲它應該返回非可選 – Honey

回答

1

在函數內部返回一個Int。然而,你的方法的實際簽名是Int?,這意味着它實際上是一個可選的,你錯了!

基本上你的方法簽名是正確的。但是當你調用這個函數時,你會得到一個可選的響應並且必須解開它。

print([5,15,512,522].challenge37(count: "5")!) // 1 

另外有你關注,你會注意到,Xcode中必須給你一個警告(和解決方案來解決它)

表達從Int?隱式強制轉換爲任何

enter image description here

Xcode給了你警告,因爲它發現你試圖打印一個可選項並知道這通常是不需要的。很明顯,它的解決方案是通過force unwrap違約解開它。