我试图获取CIF过滤器的显示名称列表。找到this site,其中包含应该提供名称的常量(带有其他信息),但下面的代码不起作用。
控制台输出:
here 01
here 02
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<CIAccordionFoldTransition 0x7a672dc0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key CIAttributeFilterName.'
我的代码:
func getCIFilterName(filterName: String) -> String{
var res = "abc"
let fltr = CIFilter(name:filterName)
println("here 01")
if contains(fltr.attributes().keys, kCIAttributeFilterDisplayName){
println("here 02")
res = fltr.valueForKey(kCIAttributeFilterDisplayName) as String
}
println("here 03")
return res
}
答案 0 :(得分:1)
attributes
方法返回字典。这样做更简单:
func getCIFilterName(filterName: String) -> String {
var res = "abc"
let fltr = CIFilter(name:filterName)
if let disp = fltr.attributes()[kCIAttributeFilterDisplayName] as? String {
res = disp
}
return res
}
但是如果我们失败了,我不喜欢你返回假值"abc"
的伎俩。这是Optionals的目的 - 让我们远离这种“神奇的价值观”。所以重写如下:
func getCIFilterName(filterName: String) -> String! {
var res : String! = nil
let fltr = CIFilter(name:filterName)
if let disp = fltr.attributes()[kCIAttributeFilterDisplayName] as? String {
res = disp
}
return res
}
但是,不要忘记检查返回值是否为nil,否则如果您尝试将其用于任何事情(如果 为零),您将崩溃。