【发布时间】: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