簡體   English   中英

如何在 Swift 中聲明計算屬性“拋出”?

[英]How do I declare that a computed property 'throws' in Swift?

class SomeClass {
  var someProperty: Int {
    throw Err("SNAFU")
  }
}

對於像上面這樣的代碼,swift 二進制文件會抱怨“錯誤未處理,因為封閉函數未聲明為“拋出”。

我如何在上面聲明 'someProperty' 'throws'?

class SomeClass {
  var someProperty throws: Int {
  }
}

class SomeClass {
  var someProperty: throws Int {
  }
}

class SomeClass {
  var someProperty: Int throws {
  }
}

似乎不起作用。

此功能是在 Swift 5.5 中為只讀計算屬性添加的,作為SE-0310 (包含在 Xcode 13 中)的一部分。

基於 SE-0310,語法為:

class SomeClass {
  var someProperty: Int {
    get throws {
      throw Err("SNAFU")
    }
  }
}

以下是 5.5 之前的 Swift 版本的先前答案:

您不能從計算屬性拋出。 如果你想拋出,你必須使用一個函數。 The Swift Programming Language末尾的 Language Reference部分的聲明部分僅列出throws (和rethrows )作為函數和初始化程序聲明的關鍵字。

雖然(還)不可能在 Swift 中從計算屬性中throw ,但我發現Chris Lattner本人在Apple Developer Forums 線程之一上提出了同樣的問題:

我們同意您應該能夠在下標和計算屬性中將 getter 和 setter 標記為“拋出”,但還沒有做到這一點。 我們可能會在某個時候支持此功能,但尚不清楚它是否會及時用於 Swift 2。

讓我提出一個解決方法:可以將屬性聲明為具有Result<DesiredPropertyType, Error> 這樣就可以像這樣訪問它:

do {
    try self.failableProperty.get()
} catch {
    ...
}

get()是 Swift 的Result 內置方法。

更新:這將在 Swift 5.5 中通過“有效的只讀屬性”得到解決: https : //github.com/apple/swift-evolution/blob/main/proposals/0310-effectful-readonly-properties.md

暫無
暫無

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

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