2017-02-15 18 views
0

я бы интересен, если есть какой-либо кратчайший способ установить значение colorPredicateбыстры установленное значение с переключателем получила ошибку: ожидаемая начальное значение после «=»

перечисления Color { случая черного корпус белого }

func predicateForColor(color: Color, compoundWith compoundPredicate: NSPredicate?) -> NSPredicate { 

// NOTE: if I use the code bellow to set the value of colorPredicate, will got error: expected initial value after '='. 
// let colorPredicate = 
//  switch color { 
//  case .black: return predicateForBlack() 
//  case .white: return predicateForWhite() 
//  } 

    func getPredicateByColor(color: Color) -> NSPredicate { 
     switch color { 
     case .black: return predicateForBlack() 
     case .white: return predicateForWhite() 
     } 
    } 

    let colorPredicate = getPredicateByColor(color: color) 

    if let predicate = compoundPredicate { 
     return NSCompoundPredicate(andPredicateWithSubpredicates: [predicate, colorPredicate]) 
    } else { 
     return colorPredicate 
    } 
} 


func predicateForBlack() -> NSPredicate { 
    print("get black predicate") 
    return NSPredicate(format: "color = black") 
} 

func predicateForWhite() -> NSPredicate { 
    print("get white predicate") 
    return NSPredicate(format: "color = white & someother condition") 
} 


print(predicateForColor(color: .black, compoundWith: nil)) 

ответ

0
let colorPredicate: NSPredicate = { (color: Color) -> NSPredicate in 
    switch color { 
     case .black: return predicateForBlack() 
     case .white: return predicateForWhite() 
    } 
}(color) 

обновление

Ваш код выдает ошибку, потому что вам нужно написать:

let variable = { switch { ... } }() 

вместо

let variable = switch { ... } 

так, что вы определяете блок и назвать его, вы не можете назначить от коммутатора заявления.

словарь подход

установки:

var lookup: [Color: NSPredicate] = [:] 
lookup[.black] = NSPredicate(format: "color = black") 
lookup[.white] = NSPredicate(format: "color = white") 

использование:

let colorPredicate = lookup[color] 
+0

Да, это работает! Спасибо за быстрый ответ. Но все еще удивляйтесь, почему прокомментированный код даст ошибку. – JerryZhou

+0

Спасибо, вы отвечаете правильно, я просто надеюсь найти лучший способ, похожий на colorPredicate = (color == .black)? predicateForBlack(): predicateForWhite() этот вид быстрого доступа. Но все равно спасибо. – JerryZhou

+0

Да, вы можете это сделать, но это будет работать только для 2-х случаев. Если вам нужно больше цветов в будущем, лучше использовать переключатель. Но это прекрасно работает: пусть colorPredicate = (color == .black)? predicateForBlack(): predicateForWhite() – simonWasHere