【问题标题】:Swift optional chaining with NSDictionary使用 NSDictionary 的 Swift 可选链接
【发布时间】:2023-03-24 19:33:01
【问题描述】:

请帮忙改一下

 if let field = parent_obj?.getFieldForCode(code) {
    if let stored_value = field["value"] as? String {

在单行中进入可选链接语法。我试着这样做:

let stored_value = parent_obj?.getFieldForCode(code)?["value"] as? String

得到一个错误:

Type 'String' does not conform to protocol 'NSCopying'

这是我的函数头:

func getFieldForCode(code: String) -> NSDictionary? 

有可能吗?我问它是因为任何时候我使用 NSArrays 和 NSDictionaries 我的代码看起来都很糟糕:

if let code = self.row_info["code"] as? String {
        if let value_field = self.row_info["value_field"] as? String {
            if let field = parent_obj?.getFieldForCode(code) {
                if let stored_value = field["value"] as? String {
                    if let fields = self.fields_set{
                        if let current_value = fields[indexPath.row][value_field] as? String {

有什么建议吗?

【问题讨论】:

  • 我相信你只需要一些括号:let stored_value = (parent_obj?.getFieldForCode(code))?["value"] as? String
  • 不,我的括号也有同样的错误...

标签: syntax swift xcode6 optional-values


【解决方案1】:

您不能将其直接转换为 String,因为您是从 NSDictionary 中提取的,并且正如错误所说,String 不符合 NSCopying。但是,String 桥接到NSString,并且NSString 确实符合NSCopying。因此,通过一些转换/桥接技巧,您可以让它像这样工作:

let stored_value: String? = parent_obj?.getFieldForCode(code)?["value"] as? NSString

注意:如果您在可选绑定中使用它(看起来像您想要的那样),请不要忘记从 stored_value 中删除 ?' s 类型声明:

if let stored_value: String = parent_obj?.getFieldForCode(code)?["value"] as? NSString {
    /* ... */
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多