Swift 可选向下转换为 Any

Swift optional downcasting as Any

如果我们尝试访问可选对象 属性 我们可以这样做吗 -

var obj: Person

var str = obj.name? as Any

这是在 swift3 中处理 nil 案例的正确方法吗?

您可以尝试使用 if let

if let name = obj.name as? String
{
   print(name)
}
else
{
   print("name is nil")
}

不太清楚你在问什么......但据我所知,你正在寻找一种方法来处理 obj.name 为零的情况。

你可以这样写:

if obj.name == nil {
    // I am nil
} else {
    // I am not nil
}

或者如果您需要捕获 non-optional 值,如何:

if let name = obj.name {
    print(name) // I am not nil
} else {
    // I am nil
}

而且我不确定你为什么要将它转换为 Any - 一般来说,如果你能坚持使用具体的类型,你将避免自己在以后的道路上头疼和痛苦。

在swift中有两种处理nil的方法:

1.使用if-let语句

    var obj: Person
    if let name = obj.name {
        var str = name
    }

您还可以在此处检查 obj.name 变量的 type as

    var obj: Person
    if let name = obj.name as? String {
        var str = name
    }

2。使用guard-let语句

    var obj: Person
    guard let name = obj.name as? String else {
        return
    }

两种条件的区别在于,使用 if-let 条件失败后,您的代码将继续执行下一行代码(如果对象为 nil),但 guard-let 将停止执行并抛出 return.

注:默认运算符??

您还可以实现默认“operator: ??”来分配默认值,例如:

var str = obj.name ?? ""

例如,如果您有 Person 对象:

class Person {
  var name: String?
}

let person = Person()

您可以通过几种方式使用 name 属性:使用 if-let? 运算符。

// if-let construction
if let personName = person.name {
  print(personName.uppercased())
}

// `?` operator example
let uppercasedPersonName: String? = person.name?.uppercased()

对于你的情况 if-let 更有可能是你想要的。