如果当前时间在TimeRange内,则过滤数组

时间:2015-01-10 16:47:20

标签: swift parse-platform filtering

我的当前函数过滤数组并返回PFObjects数组,其中只有"Type" = "Sushi"。现在,我尝试过滤数组,如果当前时间在一个时间范围内("OpenHours""CloseHours" 新函数传递dayOfWeek: InttimeNow: String

“OpenHours”示例:[0,6] = [星期日,星期一]

["0011","0011","0011","0011","0011","0011","0011"]

“CloseHours”示例:

["2350","2350","2350","2350","2350","2350","2350"]

过滤“类型”的当前函数:

  func filterRestaurants(filteredObject: String) {
 //func filterOpenNow(dayOfWeek: Int, timeNow: String){
    filteredRestaurantArray = unfilteredRestaurantArray.filter() {
        if let type = ($0 as PFObject)["Type"] as? String { // Get value of PFObject
            return type.rangeOfString("Sushi") != nil
        } else {
            println("nope")
            return false
        }
    }

基本上我需要针对给定timeNow

的当前时间OpenHours介于CloseHoursdayOfWeek之间的对象进行过滤

修改 到目前为止我尝试过的事情: 我不确定如何在PFObject数组中获取值的位置。正常我会检查timeNow是否在OpenNow [dayOfWeek]和CloseNow [dayOfWeek]之间

像这样的东西(除了过滤器):

if OpenNow[dayOfWeek] ... CloseNow[dayOfWeek] ~= timeNow {
    println("success")
}

1 个答案:

答案 0 :(得分:1)

我不完全确定PFObject实例的属性是什么,因此我将做出一些假设,您必须更正密钥才能满足您的需求。

使用您提供的功能签名并非完全可行。这是因为为了使它工作,您将访问未提供给该函数的PFObject列表。虽然Swift不会阻止你这样做,但它通常不是一个明智的设计选择,因为你无法对任何给定时间点的函数结果充满信心。因此,为了提供所谓的referential transparency,我们将修改您的函数以接收PFObject s的集合。

使用该集合,我们将使用本机filter函数来确定从函数返回哪些函数。 filter函数采用集合和闭包。闭包采用一个参数,即集合的元素,并返回Bool。闭包是决定是否保留或丢弃元素的原因。

知道这一点,我们可以建立您要求的功能。我不能保证在开始时没有更好的方法来进行第一次if let舞蹈,但它应该完成工作。

func filterAreOpen(restaurants: [PFObject], forTime time: String, onDay day: Int) -> [PFObject] {
    let openRests = filter(restaurants) { r in
        if let openHours = r["OpenHours"] as AnyObject? as? [String] {
            if let closeHours = r["CloseHours"] as AnyObject? as? [String] {
                switch (openHours[day].toInt(), closeHours[day].toInt(), time.toInt()) {
                case let (.Some(oh), .Some(ch), .Some(t)):
                    return oh...ch ~= t
                default: 
                    return false
                }
            }
        }
        return false
    }
    return openRests
}

你会像这样使用它

let rests = [ // example objects that are replaced by your PFObject instances
              [
                "OpenHours":["0011","0012","0013"],
                "CloseHours":["0023","0023","0023"],
                "Name":"Restaurant1"
              ], 
              [
                "OpenHours":["0014","0015","0016"],
                "CloseHours":["0020","0020","0020"],
                "Name":"Restaurant2"
              ]
            ]
let openRestaurants = filterAreOpen(rests, forTime: "0012", onDay: 1)
/* Results
    [{
        CloseHours =     (
            0023,
            0023,
            0023
        );
        Name = Restaurant1;
        OpenHours =     (
            0011,
            0012,
            0013
        );
    }]
*/

编辑:

关于封闭内switch的快速解释。在Swift中,switch语句比Objective-C时代的语句强大得多。它能够将值与模式匹配,而不仅仅是数字。

因此,在这种情况下,switch匹配Int?(Int?, Int?, Int?)的3元组。这是因为String的{​​{1}}方法返回toInt()Int?还能够将匹配的模式绑定到本地范围的常量。为此,我们使用switch关键字。要对let值进行模式匹配,请使用Optional模式。由于我们有一个3元组,我们使用.Some(x)三次,.Some(x)被一些有意义的名称替换。这样,如果三个x调用评估为非toInt()值,我们就可以访问我们感兴趣的三个值。

如果任何nil值无法评估为StringInt也是如此,则使用nil案例,并返回false。

您可以在条件语句here上查看语言书。