我正在尝试快速学习和理解具有关联类型的协议。
同时,我正在学习SwiftUI并参加有关Udemy的课程。
我们将构建的应用程序是咖啡订单应用程序。
话虽如此,我不会按照教程的“ T”进行操作,因为我尝试以不同的方式构建应用程序,因此我可以学习独立思考。该应用程序太花哨了。
本教程不使用泛型和协议来表示或结构化数据。这只是展示SwiftUI的教程。
我创建了一个名为Coffee的协议,该协议具有CupSize关联的类型。
每种咖啡卡布奇诺咖啡,浓缩咖啡和冲泡咖啡都按照Coffee协议进行确认。
protocol Priceable {
var cost: Double { get }
}
protocol Coffee {
associatedtype CupSize
var cupSize: CupSize { get }
init(cupSize: CupSize)
}
enum EspressoCupSize {
case small
}
struct Espresso: Coffee, Priceable {
var cupSize = EspressoCupSize.small
var cost: Double { return 3.00 }
}
enum BrewedCoffeeCupSize {
case small
case medium
case large
}
struct BrewedCoffee: Coffee, Priceable {
var cupSize: BrewedCoffeeCupSize
var cost: Double {
switch self.cupSize {
case .small: return 1.00
case .medium: return 2.00
case .large: return 3.00
}
}
}
enum CappuccinoCupSize {
case small
case medium
case large
}
struct Cappuccino: Coffee, Priceable {
var cupSize: CappuccinoCupSize
var cost: Double {
switch self.cupSize {
case .small: return 2.00
case .medium: return 3.00
case .large: return 4.00
}
}
}
然后,我创建了一个Order结构和一个OrderManager类。
订单结构具有通用名称,需要是可定价的商品。通用价位商品的想法是将来在我想扩展应用程序的情况下支持其他商品...而不仅仅是咖啡。
OrderManager的思想是跟踪所有订单并管理订单的CRUD操作(仍然需要实现删除,读取和更新)。
struct Order<Item: Priceable> {
var name: String
var item: Item
}
class OrderManager<Item> {
private var orders: [Item]
init(orders: [Item]) {
self.orders = orders
}
func add(_ order: Item) {
self.orders.append(order)
}
}
我的问题是使用OrderManager。
let maryOrder = Order(name: "Mary", item: Espresso())
let sueOrder = Order(name: "Sue", item: BrewedCoffee(cupSize: .medium))
// Dummy Structure
struct Person {}
let orderManager = OrderManager(orders: [
maryOrder,
sueOrder,
Person() // This works!!! Which is not what I want.
])
我希望OrderManager的通用类型是Order,但是由于Order具有其自己的Priceable通用类型,因此我似乎找不到正确的答案或正确的语法。
我试图让OrderManager工作的事情
class OrderManager<Order> {} // Does not work because Order needs a generic type
class OrderManager<Order<Priceable>> // Still does not work
class OrderManager<Item: Priceable, Order<Item> {} // Still does not work.
// and I tried other solutions, but I cannot get this to work
// Also, when I think I got the right syntax, I cannot add Mary and Sue's orders to
// OrderManager because Mary's item is Espresso and Sue's item is BrewedCoffee
如何才能使OrderManager仅接受订单数组?
您想尝试泛型是一件好事,但这并非最佳选择。你说:
这个想法...是将来在我想扩展应用程序时支持其他项目的功能...而不仅仅是咖啡。
但是您不需要通用的。管理订单的唯一要求是订单商品必须是Priceable。Priceable已经是一种类型;您无需在混合中添加通用类型。
struct Order {
var name: String
var item: Priceable
}
class OrderManager {
private var orders: [Order]
init(orders: [Order]) {
self.orders = orders
}
func add(_ order: Order) {
self.orders.append(order)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句