【问题标题】:Swift - Function where parameter must conform to protocol and check is kindOfSwift - 参数必须符合协议并且检查是 kindOf 的函数
【发布时间】:2017-11-03 00:03:24
【问题描述】:

我有一个包含预期和已完成订单的订单簿;两者都是 Ints 数组。

我想要一个通用的“添加”订单功能,适用于预期和完成的课程;

两个类都遵循协议。

我希望在传入的对象必须符合协议的情况下进行函数调用;不仅要检查订单是kindOf类。

protocol EntryProtocol {
    var value: Int { get set }
}

class OrderBook {
    var existingOrders: [ExistingOrder] = [ExistingOrder]()
    var completedOrders: [CompletedOrder] = [CompletedOrder]()

    func add<C1: Any>(order: C1) where C1: EntryProtocol {

        print (order is ExistingOrder.Type) // returns false
        print (order is CompletedOrder.Type)  // returns false

        // i want to do a switch here
    }
}

class ExistingOrder: EntryProtocol {
    var value : Int

    init(value: Int) {
        self.value = value
    }

    // .. other methods
}



class CompletedOrder: EntryProtocol {
    var value : Int

    init(value: Int) {
        self.value = value
    }

    // .. other methods
}


var orderBook: OrderBook = OrderBook()

let howMany = 4

for _ in 1...howMany {
    let value = 3 // this is a random number (1-6)
    let order = ExistingOrder.init(value: value)
    orderBook.add(order: order)
}

print (orderBook.existingOrders)
print (orderBook.completedOrders)

在我的 swift playground 中,当我检查 add() 函数是 ExistingOrder 还是 CompletedOrder 时,它总是返回 false

如何创建参数必须符合协议的函数;然后检查通过参数传入的对象是否属于某种类型?

非常感谢

【问题讨论】:

  • 不应该是order is ExistingOrder(没有.Type)吗?
  • 从您的 is 检查中删除 .Type
  • 虽然由于您需要使用转换对象将其添加到您的数组中,但您可能还是应该使用if let order = order as? ExistingOrder
  • 哦,好的,我会试试这个! - 嘿,这行得通,非常感谢!

标签: swift function parameters swift-protocols


【解决方案1】:

答案是使用order is ExistingOrder,记入@rmaddy,然后检查返回if let order = order as? ExistingOrder,记入@dan

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多