首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift AnyObject转换

Swift AnyObject转换
EN

Stack Overflow用户
提问于 2016-06-05 15:29:40
回答 2查看 1K关注 0票数 3

我创建了一些测试代码来显示我遇到的问题。

但是,当我试图将其放入项目中时,Xcode会给出以下警告:Treating a forced downcast to 'String' as optional will never produce 'nil' on 第30行。我收到两项解决问题的建议:

  1. Use 'as?' to perform a conditional downcast to 'String',这是完全没有意义的。但是,它确实编译时没有警告/错误,这似乎很奇怪,因为它为非可选类型的String分配了一个可选值。 使用类型强制转换操作符的条件形式(as?)当你不确定沮丧是否会成功的时候。这种形式的运算符将始终返回一个可选的值,如果不可能下行,则该值将为零。这使您能够检查是否有成功的下播。

来自Swift语言指南

如果转换失败(因此删除字典条目),除非它认为我可能希望分配nil,否则这是没有意义的。尤其是因为我确信它会成功,因为我只是直接检查它是否是一个String

  1. Add parentheses around the cast to silence this warning看上去毫无意义,但它确实压制了这一警告。这似乎是一件奇怪的事情,但话又说回来,这可能只是一个糟糕的方式来确认你真的想做你想做的事情。

哪一种选择是正确的,还是两者都不对?是什么引起了这个警告?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-05 15:55:11

正确的解决方案是使用可选绑定,而不是强制展开运算符!。实际上,您可以将check value != nil合并到switch语句中:

代码语言:javascript
复制
for (key, value) in dict {
    switch value {
    case let s as String:
        newDict[key] = s
    case let i as Int:
        newDict[key] = String(i)
    case let b as Bool:
        newDict[key] = b ? "1" : "0"
    case let v?:   // value is not `nil`
        newDict[key] = String(v)
    default:       // value is `nil`
        break
    }
}
票数 6
EN

Stack Overflow用户

发布于 2016-06-05 15:59:02

下面是您的代码,经过修改以显示如何转换函数结果以匹配AnyObject?,并避免显式展开选项:

代码语言:javascript
复制
func returnsAString() -> AnyObject? {
  return "I am a String." as? AnyObject
}

func returnsAnInt() -> AnyObject? {
  return Int(123) as? AnyObject
}

func returnsABool() -> AnyObject? {
  return true as? AnyObject
}

func returnsNilBool() -> AnyObject? {
  return nil as Bool? as? AnyObject
}

var dict    : [String : AnyObject?] = [String : AnyObject?]()
var newDict : [String : String    ] = [String : String    ]()

dict["string"] = returnsAString()
dict["int"] = returnsAnInt()
dict["bool"] = returnsABool()
dict["nil"] = returnsNilBool()

for (key, value) in dict {
    switch value {
    case let value as String:
      newDict[key] = value
    case let value as Int:
      newDict[key] = String(value)
    case let value as Bool:
      newDict[key] = (value ? "1" : "0")
    default:
      newDict[key] = "nil"
    }
}

print("Dict: \(dict)")
print("newDict: \(newDict)")

// Dict: ["nil": nil, "int": Optional(123), "bool": Optional(1), "string": Optional(I am a String.)]
// newDict: ["nil": "nil", "int": "123", "bool": "1", "string": "I am a String."]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37643581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档