2017-07-14 51 views
0

在斯威夫特4遊樂場驗證碼:過濾字典在Xcode中失敗,但成功在遊樂場

let time = 1234 
let description: String? = nil 

let keyed: [String : Any?] = [ 
    "time": time, 
    "description": description 
    ] 

let filtered: [String : String] = keyed 
    .filter{ _, value in value != nil } 
    .mapValues { value in return String(describing: value!) } 

print(keyed) 
print(filtered) 

產生這樣的輸出:

["description": nil, "time": Optional(1234)] 
["time": "1234"] 

這正是我想要的(只鍵值對,其中原始值不是nil,值解包並轉換爲字符串)。但是,在Xcode 9(測試版3)中,我的構建失敗,出現在'filter' is unavailable。這是一個測試¯\_(ツ)_/¯類的事情,還是我錯過了什麼?

+0

我無法重現相同的結果。在用Xcode 9 beta 3創建的一些項目中,您的代碼編譯時沒有問題,並生成您期望的輸出。你的環境中有什麼特別的東西? – OOPer

+0

嗯。我無法想象如此。盡我所知,我正在使用Xcode的完全香草安裝。感謝您確認它在您的最終編譯。我會看看我能否弄清楚發生了什麼事。 – Subject22

回答

0

我想這個解決一些方法,包括重新啓動的Xcode,清除DerivedData等,但在當時沒有奏效。幾天後我又回到了這個項目,發現之前編譯的代碼現在沒有問題(沒有做過任何相關的修改)。所以我將這歸咎於Xcode 9 beta的一個怪癖。或者,也許某些東西只是被粘在某個地方,Xcode最終清除了一個緩存或者其他類似的東西。 ¯\_(ツ)_/¯

3

您在使用雨燕3.2,而不是斯威夫特4.

您可以將目標的Build Options>Swift Compiler - Language>Swift Language Version

enter image description here

摘錄下從基金會的文檔進行更改: https://developer.apple.com/documentation/swift/dictionary/2903389-filter?changes=latest_minor

func filter(_ isIncluded: (Dictionary.Element) throws -> Bool) rethrows -> [Dictionary.Key : Dictionary.Value] 

的Xcode 9.0或更高版本

+0

沒有。絕對使用Swift 4.雖然好想法。 – Subject22

+0

好嗎?你有沒有嘗試在一個新的空項目上使用該代碼?在這裏工作得很好,你描述的錯誤只出現在目標的快速朗讀時。版本設置爲3.2 – nathan

+0

100%確定。但是,既然你把它恢復了起來,我只是試着把代碼從上面粘貼回到它以前失敗的同一個項目中,現在它的構建很好。我100%確定我沒有改變任何可能會有所作爲的東西,所以我會把這歸咎於某種測試怪癖。感謝您花時間幫助:) – Subject22

0

今天我有同樣的問題。

我的項目是用xCode 8.x在Swift 3.x中創建的。升級到xCode 9後,它一直工作正常,直到今天'filter is unavailable'錯誤啓動。

明確將語言版本設置爲Swift 4並沒有解決它。 (也沒有清理項目,重新啓動xCode等)

這個訣竅 - 這對我來說是 - 轉換爲整個項目爲Swift 4

(我用的開始與編輯遷移工具/轉換/到目前雨燕的語法,這是不是在5月的情況下太大的幫助,但是這是一個完全不同的事情。)

的錯誤走後。 ..