代码之家  ›  专栏  ›  技术社区  ›  ma11hew28

“(NSObject,AnyObject)”不能转换为“String”

  •  6
  • ma11hew28  · 技术社区  · 12 年前

    如何转换类型的对象 (NSObject, AnyObject) 到类型 String ?

    在以下方法的第一行的末尾, as String 导致编译器错误:

    '(NSObject, AnyObject)' is not convertible to 'String'
    

    铸造 street NSString 而不是 一串 编译,但我正在选角 大街 一串 因为我想把它与 placemark.name ,具有类型 String! NSString字符串 .

    我知道 name 大街 是可选的,但我想他们不是 nil 因为所有的地方都是从 MKLocalSearch 似乎有非零的名字和街道。

    func formatPlacemark(placemark: CLPlacemark) -> (String, String) {
        let street = placemark.addressDictionary["Street"] as String
        if placemark.name == street {
            // Do something
        }
    }
    
    3 回复  |  直到 12 年前
        1
  •  6
  •   Jeremy Hicks    10 年前

    A. String 不是对象,因此您确实需要将其转换为 NSString 。我建议使用以下语法同时对其进行强制转换和展开。不要担心将其与类型变量进行比较 String! 因为它们是兼容的。这将起作用:

    func formatPlacemark(placemark: CLPlacemark) -> (String, String) {
        if let street = placemark.addressDictionary["Street"] as? NSString {
            if placemark.name == street {
                // Do something
            }
        }
    }
    

    如果“Street”不是字典中的有效键,或者对象类型不是 NSString字符串 ,这不会崩溃。它就是进不了街区。

    如果你 真正地 希望街道成为 一串 你可以这样做:

    if let street:String = placemark.addressDictionary["Street"] as? NSString
    

    但在这种情况下,它不会给你带来任何好处。

        2
  •  2
  •   Mike Pollard    12 年前

    通过下标查找swift字典的返回类型必须是可选的,因为给定的键可能没有值。

    因此,您必须做到:

    as String?
    
        3
  •  1
  •   chazkii    12 年前

    我想这可能与 addressDictionary 作为一个 NSDictionary .

    如果您转换 地址字典 在Swift词典中,它应该会起作用。

    let street = (placemark.addressDictionary as Dictionary<String, String>)["String"]