函数中不能返回String

时间:2016-02-08 14:21:53

标签: swift

我无法将选项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) 

提前感谢您的帮助!

3 个答案:

答案 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()函数以返回StringnilString?类型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())