我的当前函数过滤数组并返回PFObjects
数组,其中只有"Type"
= "Sushi"
。现在,我尝试过滤数组,如果当前时间在一个时间范围内("OpenHours"
和"CloseHours"
)
新函数传递dayOfWeek: Int
,timeNow: 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
介于CloseHours
和dayOfWeek
之间的对象进行过滤
修改 到目前为止我尝试过的事情: 我不确定如何在PFObject数组中获取值的位置。正常我会检查timeNow是否在OpenNow [dayOfWeek]和CloseNow [dayOfWeek]之间
像这样的东西(除了过滤器):
if OpenNow[dayOfWeek] ... CloseNow[dayOfWeek] ~= timeNow {
println("success")
}
答案 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
值无法评估为String
,Int
也是如此,则使用nil
案例,并返回false。
您可以在条件语句here上查看语言书。