You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift实现车辆管理器:注册类按需初始化(自定义构造器)

Swift 实现支持自定义构造器的车辆管理器

核心思路

让每个车辆类型自行负责从URN解析参数并完成初始化,管理器仅维护URN类型与车辆创建逻辑的映射,无需关心具体构造器细节。

具体实现

1. 定义URN解析结构体

先实现一个用于解析URN字符串的结构体:

struct URN {
    let namespace: String
    let type: String
    let identifier: String
    
    init(rawValue: String) throws {
        let components = rawValue.split(separator: ":")
        guard components.count == 3 else {
            throw URLError(.badURL)
        }
        self.namespace = String(components[0])
        self.type = String(components[1])
        self.identifier = String(components[2])
    }
}

2. 重构Vehicle协议

给协议添加静态属性(关联URN类型标识)和创建方法(子类自定义初始化逻辑):

protocol Vehicle {
    static var vehicleURNType: String { get } // 对应URN中的类型字段,如"car"、"bus"
    func start()
    static func create(from urn: URN) throws -> Self // 子类实现从URN生成实例的逻辑
}

3. 实现具体车辆类

每个车辆类实现协议要求的方法,自定义构造器逻辑:

class Car: Vehicle {
    static let vehicleURNType = "car"
    let seats: Int
    
    init(seats: Int) {
        self.seats = seats
    }
    
    func start() {
        print("Car with \(seats) seats starts")
    }
    
    static func create(from urn: URN) throws -> Car {
        guard let seats = Int(urn.identifier) else {
            throw URLError(.badURL)
        }
        return Car(seats: seats)
    }
}

class Bus: Vehicle {
    static let vehicleURNType = "bus"
    let shouldStop: Bool
    
    init(shouldStop: Bool) {
        self.shouldStop = shouldStop
    }
    
    func start() {
        print("Bus \(shouldStop ? "will stop" : "won't stop") starts")
    }
    
    static func create(from urn: URN) throws -> Bus {
        guard let shouldStop = Bool(urn.identifier) else {
            throw URLError(.badURL)
        }
        return Bus(shouldStop: shouldStop)
    }
}

4. 实现车辆管理器

用字典存储车辆类型对应的创建工厂,支持外部注册和实例化:

class VehicleManager {
    private var registeredFactories: [String: (URN) throws -> Vehicle] = [:]
    
    // 注册车辆类型
    func registerVehicle<T: Vehicle>(_ type: T.Type) {
        registeredFactories[T.vehicleURNType] = { try T.create(from: $0) }
    }
    
    // 根据URN生成对应车辆实例
    func run(for rawURN: String) throws -> Vehicle {
        let urn = try URN(rawValue: rawURN)
        guard let factory = registeredFactories[urn.type] else {
            throw URLError(.unsupportedURL)
        }
        return try factory(urn)
    }
}

5. 使用示例

let manager = VehicleManager()
manager.registerVehicle(Car.self)
manager.registerVehicle(Bus.self)

do {
    let car = try manager.run(for: "urn:car:1234")
    car.start() // 输出: Car with 1234 seats starts
    
    let bus = try manager.run(for: "urn:bus:true")
    bus.start() // 输出: Bus will stop starts
} catch {
    print("Error: \(error.localizedDescription)")
}

方案优势

  • 解耦逻辑:车辆的初始化细节由子类自行维护,管理器无需知晓每个类的构造器参数。
  • 扩展性好:新增车辆类型时,只需实现Vehicle协议并注册到管理器,无需修改现有代码。
  • 高效查找:用字典存储工厂闭包,根据URN类型快速定位创建逻辑,比遍历数组效率更高。
  • 统一错误处理:所有解析、初始化错误通过throws抛出,调用方可统一处理。

内容的提问来源于stack exchange,提问作者palme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:43:09