当前位置: 首页 > 面试题库 >

如何从Any类型解开可选值?

韦棋
2023-03-14
问题内容

给定的数组[Any]具有可选和非可选值的混合,例如:

let int:Int? = 1
let str:String? = "foo"

let values:[Any] = [int,2,str,"bar"]

我们怎样才能提取的值OptionalAny类型(如果有的话),所以我们可以创建一个通用的打印功能,仅打印出的值。

例如,此printArray函数通过并打印每个元素:

func printArray(values:[Any]) {
    for i in 0..<values.count {
        println("value[\(i)] = \(values[i])")
    }
}

printArray(values)

将输出:

value[0] = Optional(1)
value[1] = 2
value[2] = Optional("foo")
value[3] = bar

我们如何更改它,以便它仅打印基础值,以便在“可选”时解开该值?例如:

value[0] = 1
value[1] = 2
value[2] = foo
value[3] = bar

更新进度…

将参数更改为时[Any?],它可以工作,例如:

let values:[Any?] = [int,2,str,"bar"]

func printArray(values:[Any?]) {
    for i in 0..<values.count {
        println("value[\(i)] = \(values[i]!)")
    }
}

printArray(values)

这将打印所需的:

value[0] = 1
value[1] = 2
value[2] = foo
value[3] = bar

但是仍然想看看我们如何解开Optional,Any因为MirrorType.value返回的结果使得提取Optional值变得困难,例如:

class Person {
    var id:Int = 1
    var name:String?
}

var person = Person()
person.name = "foo"

var mt:MirrorType = reflect(person)
for i in 0 ..< mt.count {
    let (name, pt) = mt[i]
    println("\(name) = \(pt.value)")
}

打印输出:

id = 1
name = Optional("foo")

当我需要时:

id = 1
name = foo

问题答案:

对于Xcode 7和Swift 2:

func unwrap(any:Any) -> Any {

    let mi = Mirror(reflecting: any)
    if mi.displayStyle != .Optional {
        return any
    }

    if mi.children.count == 0 { return NSNull() }
    let (_, some) = mi.children.first!
    return some

}


let int:Int? = 1
let str:String? = "foo"
let null:Any? = nil
let values:[Any] = [unwrap(int),2,unwrap(str),"bar", unwrap(null)]

这会给你 [1, 2, "foo", "bar", {NSObject}]

更改NSNull()为,nil并且unfrap func的返回Any?始终将解开任何类型。



 类似资料:
  • 问题内容: 如何解开返回为以下内容的字符串: (可选(可选“蓝色”)) cityLabelName打印为 问题答案: 给定一个double可选,如以下双重包装: @Leo 表明您可以使用 可选绑定 两次: 或强制解开两次: 您可以使用以下5种方法来安全解开double可选: 方法1: 您还可以使用 模式匹配 : 正如@netigger在回答中指出的那样,它也可以写成: 简洁性虽然较差,但较容易阅读

  • 问题内容: 您如何正确地拆开普通选项和隐式选项? 这个主题似乎有些混乱,我只想对所有方法以及它们如何有用提供参考。 当前有两种创建可选项的方法: 有两种解开包装的方式吗?另外,使用和展开过程之间有什么区别? 问题答案: 有很多相似之处,只有少数区别。 (常规)可选 宣言: 不安全地展开: 安全地测试存在: 通过绑定安全地展开: 安全链接: 安全合并零值: 隐式展开的可选 宣言: 不安全地展开(隐式

  • keyof Map<any, any>返回的什么类型啊? 在vue3的源码里有这么一个类型 这里的Omit<T, keyof Map<any, any>>里的keyof Map<any, any>返回的什么类型啊? never吗? 我单独给一个变量赋值为这个类型,发现不管是什么值都不符合 let test: keyof Map<any, any>

  • 这是另一个StackOverflow问题的代码段: 我真的很难理解选修课的用法。返回代码是“返回映射(字符串)的值”还是NULL(如果失败)? return如何作用于方法而不是类-这是可选的。不可数()?

  • 本文向大家介绍SpringMVC Controller 返回值的可选类型详解,包括了SpringMVC Controller 返回值的可选类型详解的使用技巧和注意事项,需要的朋友参考一下 spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void。 ModelAndView 通过ModelAndView构造方

  • 场景:登录www.makemytrip.com-->单击“我的帐户”链接-->单击“配置文件”选项-->弹出“个人信息” 我不能使用Select,因为它不是类型下拉列表。好心的建议,我可以如何编码选择不同的值从类型按钮的标题字段。