Swift - 函数参数必须符合协议和检查是kindOf

问题描述:

我有一个OrderBook与预期和完成的订单;两者都是Ints数组。Swift - 函数参数必须符合协议和检查是kindOf

我想要一个'添加'顺序功能,它是通用的,适用于预期类和完成类;

两个类都遵循一个协议。

我希望进行函数调用,其中传入的对象必须符合协议;不仅如此,我想检查的订单是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) 

在我迅速的操场上,add()函数,当我检查,看看它是否是一个ExistingOrder或CompletedOrder

我如何做一个函数,其中的参数必须符合协议始终返回false ;然后检查通过参数传入的对象是否属于某种类型?

非常感谢

+1

难道不该'顺序是ExistingOrder'(不'.Type') ? – rmaddy

+1

从'is'检查中移除'.Type' – dan

+0

尽管因为您需要使用铸造对象将其添加到数组中,您应该可以执行'if let order = order as?反正现在的订单 – dan

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