Hoe verklaar ik dat een berekende eigenschap in Swift ‘gooit’?

Voor code zoals hierboven klaagt het snelle binaire bestand ‘fout wordt niet afgehandeld omdat de omsluitende functie niet is gedeclareerd als ‘throws’.

Hoe verklaar ik dat ‘someProperty’ in het bovenstaande ‘gooit’?

class SomeClass {
  var someProperty throws: Int {
  }
}

en

class SomeClass {
  var someProperty: throws Int {
  }
}

en

class SomeClass {
  var someProperty: Int throws {
  }
}

lijken niet te werken.


Antwoord 1, autoriteit 100%

Deze functionaliteit is toegevoegd voor alleen-lezen berekende eigenschappen in Swift 5.5 als onderdeel van SE-0310(opgenomen in Xcode 13).

Op basis van SE-0310 zou de syntaxis zijn:

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

Hier is het vorige antwoord voor versies van Swift ouder dan 5.5:

Je kunt niet gooien vanuit een berekende eigenschap. Je moet een functie gebruiken als je wilt gooien. De Declaraties van het gedeelte Taalreferentieaan het einde van De Swift-programmeertaalvermeldt alleen throws(en rethrows) als trefwoord voor functie- en initialisatiedeclaraties.


Antwoord 2, autoriteit 72%

Hoewel het (nog) nietis om throwvan berekende eigenschappen in Swift, vond ik Chris Lattnerbeantwoordt zelf dezelfde vraag op een van de threads van Apple Developer Forums:

We zijn het ermee eens dat je de getters en setters moet kunnen markeren als “worpen” in subscripts en berekende eigenschappen, maar we zijn er nog niet. We zullen dit waarschijnlijk ooit ondersteunen, maar het is niet duidelijk of het op tijd zal zijn voor Swift 2.


Antwoord 3, autoriteit 4%

Laat me een tijdelijke oplossing voorstellen: een eigenschap kan worden gedeclareerd als type Result<DesiredPropertyType, Error>. Op deze manier is het als volgt toegankelijk:

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

get()is een ingebouwde methode van Swift’s Result.

UPDATE: dit wordt aangepakt in Swift 5.5 met “effectieve alleen-lezen eigenschappen”: https://github.com/apple/swift-evolution/blob/main/proposals/0310-effectful-readonly-properties.md.

Other episodes