我无法将选项AnyObject转换为字符串。每当我尝试调用函数时,我的程序都会与(lldb)
崩溃。这就是功能。
func name() -> String {
print(attributes["name"])
print(attributes["name"]! as! String)
let name = attributes["name"]! as! String
return name
}
印刷品的输出是:
Optional(Optional(Josh))
Josh
(lldb)
提前感谢您的帮助!
答案 0 :(得分:0)
在所有这些示例中,attributes
定义为:
var attributes: AnyObject? = ["name": "Josh"]
看起来由于类型安全问题导致崩溃。尝试:
func name() -> String? {
if let name = attributes!["name"] as? String {
return name
}
return nil
}
另一种选择,稍微快一点:
func name() -> String? {
guard let name = attributes!["name"] as? String else { return nil }
return name
}
另一个选项是使用该函数的块,以便在attributes
不包含键"name"
时它不会返回任何内容:
func name(block: ((text: String?) -> Void)) {
guard let name = attributes!["name"] as? String else { return }
return block(text: name)
}
// Usage:
name { text in
print(text!)
}
打印:
约什
答案 1 :(得分:0)
让我们说attributes
定义如下
var attributes: NSMutableDictionary? = NSMutableDictionary()
可以像下面一样填充
attributes?.setValue("Walter White", forKey: "name")
您应该设计name()
函数以返回String
或nil
(String?
类型Optional
func name() -> String? {
guard let
attributes = attributes,
name = attributes["name"] as? String else { return nil }
return name
}
同样的逻辑也可以这样写出
func name() -> String? {
return attributes?["name"] as? String
}
现在,如果在String
内找到了有效attributes
的值name
,则会返回该值。否则该函数返回nil
。
使用此功能时,您应展开结果
if let name = name() {
print(name) // prints "Walter White"
}
答案 2 :(得分:-1)
if let _string = attributes["name"] as? String {
return _string
}
// fallback to something else, or make the method signature String?
return ""
使用选项时,您不想只用感叹号包装东西。如果该值最终不是字符串,或者根本没有存在于地图中,那么您的代码将很难完成并可能导致应用程序崩溃。
如果您需要非可选字符串,请考虑返回空字符串作为回退方法,并使用if let
模式返回可选字符串(如果可用)。
- 编辑 -
不确定downvote ......这是在操场上。
var attributes = [String:AnyObject]()
attributes["name"] = "test"
func name() -> String {
print(attributes["name"])
print(attributes["name"]! as! String)
let name = attributes["name"]! as! String
return name
}
// does not compile
//print(name())
func name2() -> String {
if let _string = attributes["name"] as? String {
return _string
}
// fallback to something else, or make the method signature String?
return ""
}
// prints test
print(name2())