Swift:返回一个布尔值

时间:2015-11-16 13:40:22

标签: swift boolean

我正在创建一种考虑某些产品优惠的耕作系统。我需要创建一个半价优惠,根据是否已应用优惠,显示真或假。

HalfPrice Class:

class HalfPriceOffer :Offer {

init(){
    super.init(name: "Half Price on Wine")
    applicableProducts = [901,902];
}

override func isApplicableToList(list: [ShoppingItem]) -> Bool {
    //should return true if a dicount can be applied based on the supplied list of products (i.e. a product must be matched to an offer)

    return false
}

ShoppingItem类

import Foundation

class ShoppingItem {

var name :String
var priceInPence :Int
var productId :Int

init(name:String, price:Int, productId:Int){
    self.name = name
    self.priceInPence = price
    self.productId = productId
}
}

我知道它使用循环;但我不确定如何写它。在此先感谢:)

2 个答案:

答案 0 :(得分:1)

您可以使用reduce函数来实现此目的:

func isApplicableToList(list: [ShoppingItem]) -> Bool {
    return list.reduce(false) { (initial: Bool, current: ShoppingItem) -> Bool in
        return initial || applicableProducts.contains(current.productId)
    }
}

你甚至可以写得更短(Swift太棒了):

func isApplicableToList(list: [ShoppingItem]) -> Bool {
    return list.reduce(false) { $0 || applicableProducts.contains($1.productId) }
}

答案 1 :(得分:0)

考虑要约项目是否在列表中而不是列表项目在要约中,可能不那么复杂。

override func isApplicableToList(list: [ShoppingItem]) -> Bool {
    //should return true if a discount can be applied based on the supplied list of products (i.e. a product must be matched to an offer)
    let a = list.map({$0.productId})
    for p in applicableProducts
    {
        if !a.contains(p) {return false}
    }
    return true
}

这是一个完整的代码示例,它填补了示例代码中隐含的空白:

class ShoppingItem {
    var name: String
    var priceInPence: Int
    var productId: Int

    init(name:String, price:Int, productId:Int){
        self.name = name
        self.priceInPence = price
        self.productId = productId
    }
}

class Offer {
    var applicableProducts = [Int]()
    var name:String
    init(name: String) {
        self.name = name

    }
    func isApplicableToList(list: [ShoppingItem]) -> Bool {
        return false
    }
}


class HalfPriceOffer: Offer {
    init(){
        super.init(name: "Half Price on Wine")
        applicableProducts = [901,902]
    }

    override func isApplicableToList(list: [ShoppingItem]) -> Bool {
        //should return true if a discount can be applied based on the supplied list of products (i.e. a product must be matched to an offer)
        let a = list.map({$0.productId})
        for p in applicableProducts
        {
            if !a.contains(p) {return false}
        }
        return true
    }
}

let a = [ShoppingItem(name: "one", price: 1000, productId: 901), ShoppingItem(name: "two", price: 1009, productId: 907),ShoppingItem(name: "three", price: 1084, productId: 902)]
HalfPriceOffer().isApplicableToList(a) // true

let b = [ShoppingItem(name: "one", price: 1000, productId: 901), ShoppingItem(name: "two", price: 1009, productId: 907)]
HalfPriceOffer().isApplicableToList(b) // false