簡體   English   中英

如何在 Swift 中為我的函數創建編譯器警告

[英]How to create Compiler warning for my function in Swift

我想驗證我的輸入以在某些條件下運行並顯示為編譯器警告/錯誤。

怎么可能?

例如:

func getPoints(start: Int, end: Int) {

}

當有人試圖為開始而不是結束提供高輸入時,我想顯示編譯器警告/錯誤。

getPoints(start: 3, end: 10) // No warnings
getPoints(start: 6, end: 2) // Compiler warning like: end value can not be less than start value

實際上,這是出於框架目的。 我想確保參數不是錯誤的輸入。

這樣的約束不能在編譯時強制執行。 Range為例,它強制lowerBound總是小於或等於upperBound 這只是一個在運行時運行的斷言,如果不滿足就會崩潰。

我建議您更改 API 設計以使用Range<Int>ClosedRange<Int>將成對的Int用於模擬范圍是一個壞主意,原因有很多:

  1. 它不傳達范圍的語義。 兩個整數可以是任何東西,但范圍是更具體的東西。
  2. 它沒有任何有用的方法,例如contains(_:) ,也沒有通過~=運算符支持模式匹配。
  3. 它容易出錯,因為在傳遞對時,您可能會犯復制/粘貼錯誤,導致您不小心兩次使用相同的參數。
  4. 讀起來更好: getPoint(3...10)

您無法在編譯時生成警告,因為除了檢查類型一致性之外,不會評估參數。

在您的示例中,您使用了常量,因此理論上可以執行您想要的檢查,但是如果您傳遞了一個變量或另一個函數的結果呢? 編譯器需要執行多少代碼才能執行檢查?

您需要在運行時強制執行您的要求。 例如,如果參數不正確,您可以讓函數throw

enum MyErrors: Error {
     case rangeError
}

func getPoints(start: Int, end: Int) throws {
    guard start <= end else {
        throw MyErrors.rangeError
    }
    ...
}

或者你可以讓函數簡單地處理問題:

func getPoints(start: Int, end: Int) {
     let beginning = min(start,end)
     let ending = max(start,end)
     ...
}

另外,我建議亞歷山大使用Range而不是Int的建議; 利用 Foundation 類型總是一個好主意,但我會留下我的答案,因為它顯示了一些在運行時處理問題的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM