對於此問題,您使用[Any]
的建議將編譯,但如果您在屬性中需要Any
(或AnyObject
),則幾乎總會有設計錯誤。 Any
存在罕見的情況下,你真的必須繞過類型系統,但你通常會遇到許多令人頭疼的事情。
根據您的潛在目標的實際情況,這些類型的問題有很多類型安全的解決方案。最有可能的解決方案,如果你的目標是保持詮釋的方法從浮動的方法分離出來,是用一個枚舉:
enum Operator {
case int((Int, Int) -> Int)
case float((Float, Float) -> Float)
}
let sum1 = Operator.int {(a, b) in return a + b }
let sum2 = Operator.float {(a, b) in return a + b}
let cl = [sumop1, sumop2]
Any
意味着您可以扔掉它絕對任何東西,它是你的問題弄清楚什麼處理你在其中找到的隨機事物。編譯器不能幫助你,並且在某些情況下會積極地對抗你。您需要接受未定義的行爲,或者在整個地方添加precondition
以在運行時檢查您沒有犯錯。
Operator
是「OR」類型。 [Operator]
是一組在Ints或Floats上運行的函數。這似乎意味着什麼,所以讓編譯器通過告訴它這是你的意思來幫助你。編譯器會在編譯時檢測錯誤,而不是在運行時崩潰。許多單元測試變得不必要,因爲整個類的錯誤是不可能的。有了正確的類型和編譯器的幫助下,您可以簡化cl
到:
let cl: [Operator] = [.int(+), .float(+)]
這是相當不錯的IMO。另一方面,如果目標是接受Ints和Floats,那麼你應該把它們包裝在NSNumber中,這兩者都可以工作。如果你想跟蹤哪個是整數的,哪些是花車讓你能夠更仔細地運用你的數學,你可以創建一個結構:
struct Number {
enum Kind {
case Int
case Float
}
let value: NSNumber
let type: Kind
}
是關於陣列中的類型或的缺失參數的錯誤閉包例如'let cl = [sum1(1,2),sum2(3.0,4.0)]'? – vadian
它說:「表達式的類型是不明確的,沒有更多的上下文」 –
如果你想持有封閉是真實的不同類型然後標記你的數組類型任何'let sum1 = {(a:Int,b:Int) - > Int返回a + b} let sum2 = {(a:Float,b:Float) - > Float in a + b} var cl:[Any] = [sum1,sum2]' –