Pet*_*vin 4 final sealed associated-types swift
我试图在 Swift 中实现 Kotlin 密封类的效果,以便我可以实现基于类的替代方法来替代具有关联类型的枚举。
以下结果会导致编译器错误:
final class Foo {
class Bar: Foo {} // Error: inheritance from a final class "Foo"
}
Run Code Online (Sandbox Code Playgroud)
有没有办法有效地“密封”一个 Swift 类,使其免受进一步的子类化,但仍然首先允许子类化?
我会看看这个 使用 Kotlin 的密封类来近似 Swift 的枚举与关联数据和(主要是)这个 Swift Enumerations Docs
科特林:
sealed class Barcode {
class upc(val numberSystem: Int, val manufacturer: Int, val product: Int, val check: Int) : Barcode()
class qrCode(val productCode: String) : Barcode()
}
Run Code Online (Sandbox Code Playgroud)
进而:
fun barcodeAsString(barcode: Barcode): String =
when (barcode) {
is Barcode.upc -> “${barcode.numberSystem} ${barcode.manufacturer}
${barcode.product} ${barcode.check}”
is Barcode.qrCode -> “${barcode.productCode}”
}
Run Code Online (Sandbox Code Playgroud)
在Swift 中:
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
Run Code Online (Sandbox Code Playgroud)
然后做这样的事情:
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("SDFGHJKLYFF")
Run Code Online (Sandbox Code Playgroud)
或者:
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)")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3919 次 |
| 最近记录: |