实现Swift中封class的效果
Achieving the effect of a sealed class in Swift
我正在尝试在 Swift 中实现 Kotlin sealed class 的效果,以便我可以实现基于 class 的具有关联类型的枚举替代方案。
以下导致编译器错误:
final class Foo {
class Bar: Foo {} // Error: inheritance from a final class "Foo"
}
有没有办法从进一步的子classing中有效地"seal"一个Swiftclass,但首先仍然允许子classing ?
你可以把它和它的子class放在一个框架中并标记它public
。 public
class 不能被其进口商转入class(相反 open
class 可以)。
我会看看这个
Using Kotlin’s sealed class to approximate Swift’s enum with associated data 和(大部分)这个
Swift Enumerations Docs
Kotlin:
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}”
}
而在 Swift:
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)")
}
我正在尝试在 Swift 中实现 Kotlin sealed class 的效果,以便我可以实现基于 class 的具有关联类型的枚举替代方案。
以下导致编译器错误:
final class Foo {
class Bar: Foo {} // Error: inheritance from a final class "Foo"
}
有没有办法从进一步的子classing中有效地"seal"一个Swiftclass,但首先仍然允许子classing ?
你可以把它和它的子class放在一个框架中并标记它public
。 public
class 不能被其进口商转入class(相反 open
class 可以)。
我会看看这个 Using Kotlin’s sealed class to approximate Swift’s enum with associated data 和(大部分)这个 Swift Enumerations Docs
Kotlin:
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}”
}
而在 Swift:
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)")
}