Достижение эффекта запечатанного класса в Swift

Я пытаюсь добиться эффекта запечатанного класса Kotlin в Swift, чтобы я мог реализовать основанную на классе альтернативу перечислениям со связанными типами.

Следующие результаты приводят к ошибке компилятора:

final class Foo {
    class Bar: Foo {}  // Error: inheritance from a final class "Foo"
}

Есть ли способ эффективно "изолировать" класс Swift от дальнейшего создания подклассов, но все же разрешить создание подклассов в первую очередь?

2 ответа

Я хотел бы взглянуть на это Использование запечатанного класса Kotlin для аппроксимации перечисления Swift со связанными данными и (главным образом) этими документами Swift Enumerations

Котлин:

sealed class Barcode {
   class upc(val numberSystem: Int, val manufacturer: Int, val product: Int, val check: Int) : Barcode()
   class qrCode(val productCode: String) : Barcode()
}

а потом:

fun barcodeAsString(barcode: Barcode): String =
   when (barcode) {
      is Barcode.upc -> “${barcode.numberSystem} ${barcode.manufacturer} 
   ${barcode.product} ${barcode.check}”
      is Barcode.qrCode -> “${barcode.productCode}”
}

Находясь в Свифте:

enum Barcode {
   case upc(Int, Int, Int, Int)
   case qrCode(String)
}

А затем делайте такие вещи, как:

var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("SDFGHJKLYFF")

или же:

switch productBarcode {
case .upcA(let a, let b, let c, let d):
    print("UPC: \(a),\(b),\(c),\(d)")
case .qrCode(let code):
    print("QR Code: \(code)")
}

Вы могли бы поместить это и его подкласс в структуру и отметить это public, public класс не может быть разделен на подклассы его импортером (в отличие от open класс который может)

Другие вопросы по тегам