【问题标题】:Unwrap value of non-optional非可选的展开值
【发布时间】:2021-06-30 21:47:41
【问题描述】:
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)

【问题讨论】:

  • 你到底想问什么?
  • 我可以将p:Any 转换为p:Any? 以获得1.23。有可能吗?
  • 可选只是另一种值,它们本身可以分配一个Any。这可能会导致令人困惑的行为,这就是为什么这样做会引发编译器警告。您忽略了该警告,因此现在您看到了令人困惑的行为。那么你到底想达到什么目的呢?

标签: swift swift3


【解决方案1】:

如果你想得到只是

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

【讨论】:

  • 不错的解决方案。如果我不知道 OpDoub 中的原始数据类型?有没有办法不检查每种数据类型?我想立即将任何类型的数据转换为字符串...
猜你喜欢
  • 1970-01-01
  • 2019-01-29
  • 2018-11-30
  • 2023-03-20
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
相关资源
最近更新 更多