微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

展开非可选值

如何解决展开非可选值

var OpDoub:Optional<Double> = 1.23

func noopt(_ pp: Any) -> Any  {
    return pp
}
var p:Any = noopt(OpDoub)
print(p)  // Optional(1.23)
print(p!) // error: cannot force unwrap value of non-optional type 'Any'

我可以在声明 P 后获得 1.23 的值吗? 我试过了:

var pp:Any? = p
print(pp)  // Optional(Optional(1.23)) it turned out even worse :D
print(pp!) // Optional(1.23)

解决方法

如果你只是想得到

1.23

... 那么你应该 downcast p 到一个 Double:

var OpDoub:Optional<Double> = 1.23

func noopt(_ pp: Any) -> Any  {
    return pp
}
var p:Any = noopt(OpDoub)
    
if let doubleP = p as? Double { /// here!
    print(doubleP) /// result: 1.23
}

编辑

如果你想解包 p(使它不是可选的)并将它变成一个字符串,那么试试这个(基于 this awesome answer):

func unwrap(_ instance: Any) -> Any {
    let mirror = Mirror(reflecting: instance)
    if mirror.displayStyle != .optional {
        return instance
    }
    
    if mirror.children.count == 0 { return NSNull() }
    let (_,some) = mirror.children.first!
    return some
}

let unwrappedP = unwrap(p)
let string = "\(unwrappedP)" /// using String Interpolation https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html#ID292
print("unwrapped string: \(string)")

结果:

解包字符串:1.23

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。