加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何检查是否已使用Swift反射设置属性?

发布时间:2020-12-14 05:33:55 所属栏目:百科 来源:网络整理
导读:我的一些模型具有可选属性.我正在尝试编写一种可以评估它们是否已设置的方法. 下面是一个尝试,但我无法弄清楚如何从Any对象确定一个nil值[编辑:(子变量的类型为Any)].它不编译. func allPropertiesHaveValues(obj: AnyObject) - Bool { let mirror = Mirror(
我的一些模型具有可选属性.我正在尝试编写一种可以评估它们是否已设置的方法.

下面是一个尝试,但我无法弄清楚如何从Any对象确定一个nil值[编辑:(子变量的类型为Any)].它不编译.

func allPropertiesHaveValues(obj: AnyObject) -> Bool {
    let mirror = Mirror(reflecting: obj)
    for child in mirror.children {
       let value = child.value
       if let optionalValue = value as? AnyObject? { //Does not compile
          if optionalValue == nil {
             return false 
          }
       }
    }
    return true
}

编辑:

我忘了澄清上面示例中的子值始终是Any类型. Any类型很难,因为它无法与nil进行比较,并且对AnyObject的强制转换总是失败.我试图在下面的操场上说明它.

var anyArray = [Any]();

var optionalStringWithValue: String? = "foo";
anyArray.append(optionalStringWithValue);

var nilOptional: String?
anyArray.append(nilOptional)

print(anyArray[0]);   // "Optional("foo")n"
print(anyArray[1]);   // "niln"

if let optionalString = anyArray[0] as? AnyObject {
    //will always fail
    print("success")
}

//if anyArray[1] == nil {  //  will not compile

//}
过时:

您只需检查可选值是否为零:

func allPropertiesHaveValues(obj: AnyObject) -> Bool {
   let mirror = Mirror(reflecting: obj)
   for child in mirror.children {
     //child.value being an optional
     if child.value == nil {
       return false
     }
    }
   return true
}

编辑:

要检查Any对象是否是可选的并且是否包含使用反射的值:

let optionalString : String? = "optional string"
let any : Any = optionalString

//First you will need to create a mirror of the any object
let mirror = Mirror(reflecting : any)

//Then you can check the display style to see if it's an optional
if mirror.displayStyle == .Optional {
    //If it is,check the count of its children to see if there is a value or not
    if mirror.children.count == 0 {
        print("I don't have a value")
    }
    else {
        print("I have a value")
    }
}

这是一个游乐场示例(基于您的):

var anyArray = [Any]()

var optionalStringWithValue: String? = "foo"
anyArray.append(optionalStringWithValue)

var nilOptional: String?
anyArray.append(nilOptional)

let string = "string not optional"
anyArray.append(string)

print(anyArray[0])   // "Optional("foo")n"
print(anyArray[1])   // "niln"
print(anyArray[2])   // "string not optionaln"

let mirrorOptionalWithValue = Mirror(reflecting: anyArray[0])

if mirrorOptionalWithValue.displayStyle == .Optional
    && mirrorOptionalWithValue.children.count == 1 {
    print("Is an optional and contains a value")
}

let mirrorOptionalWithoutValue = Mirror(reflecting: anyArray[1])

if mirrorOptionalWithoutValue.displayStyle == .Optional &&
    mirrorOptionalWithoutValue.children.count == 0 {
    print("Is an optional but is nil")
}

let mirrorNotAnOptional = Mirror(reflecting: anyArray[2])

if mirrorNotAnOptional.displayStyle != .Optional {
    print("Is not an optional")
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读