[英]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.