繁体   English   中英

在Swift和iOS Xcode中检查两个对象是否为零

[英]Check if TWO objects are nil in Swift, ios xcode

我想比较两个(相同类的)对象并返回非零值。

您如何迅速编写这样的内容?

func returnWhatIsNotNil(objA: SomeClass, objB: SomeClass) -> SomeClass {
    if objA != nil && objB != nil { //error
      //both are not nil
      return nil
    }

    if objA == nil && objB != nil { // error 
       // objA is nil
       return objB
    }

    if objA != nil && objB == nil { // error
       // objB is nil
       return objA
    }
 }

一个物体

if let x = objA {
    //objA is not nil
}

会完成这项工作,但是我安静地不知道该如何使用两个对象来完成这项工作。

编辑:对不起,您的原始问题有误。 如果在两个都不为nil时都希望nil ,那么这里是一个单行代码: return objA.map { objB == nil ? $0 : nil } ?? objB return objA.map { objB == nil ? $0 : nil } ?? objB return objA.map { objB == nil ? $0 : nil } ?? objB 但是,@ LeoDabus的版本使用if…let…where对我而言更具可读性。


进行预编辑,假设您都不想要任何一个时都想要第一个:

您要使用nil-coalescing运算符?? 因此,要从函数中返回可选值,只需return objA ?? objB return objA ?? objB 注意,所有输入和输出类型也必须是可选的。

通常情况下,如果没有,则使用它来提供默认值,即"foo".toInt() ?? 0 "foo".toInt() ?? 0 ,如果不为nil,则取消包装该值;如果为nil,则将其替换为默认值。

但是,如果右侧也是可选的,它将返回一个可选,左侧的非零则为可选,否则将返回右侧,即使那个为零。

let i: Int? = nil
let j: Int? = nil
let k: Int? = 42

if let num = i ?? j {
  fatalError("won't execute")
}

if let num = j ?? k {
    assert(num == 42, "k will be chosen")
}
else {
    fatalError("this would run if all 3 were nil")
}

还请记住,您可以连锁?? 太:

let x = i ?? j ?? k ?? 0  // will result in an unwrapped 42
class SomeObject {

}

func returnWhatIsNotNil(objA: SomeObject?, objB: SomeObject?) -> SomeObject? {
    if let objA = objA where objB == nil {
        return objA
    }
    if let objB = objB where objA == nil {
        return objB
    }
    return nil
}

作为@LeoDabus接受的答案的后续措施,您还可以使用switch语句:

class SomeObject {

}

func returnWhatIsNotNil(objA: SomeObject?, objB: SomeObject?) -> SomeObject? {
    switch (objA, objB) {
    case (let a, nil): return a
    case (nil, let b): return b
    default: return nil
    }
}

如前所述,零合并运算符?? 可以使用。

这是函数的实现,请注意,您没有定义当objA和objB均为非nil时会发生什么

func returnWhatIsNotNil(objA: SomeClass?, objB: SomeClass?) -> SomeClass? {
    return objA ?? objB
}

虽然可以在Swift中对代码进行文字转换,但这是

func returnNotNil(num1: Int?, num2: Int?) -> Int?
{
    if let x = num1 {
        return x
    }
    else if let y = num2
    {
        return y
    }
    else
    {
        return nil
    }
}

这里的问题是,在Swift中,我们必须将返回类型保持为可选-因此,一旦从函数返回,您将不得不再次检查返回的值是否为nil并解包。 恕我直言,逻辑上的翻译是(假设当它们都不为零时,您也不介意返回两者)

func returnNotNilOrAssert(num1: Int?, num2: Int?) -> Int
{
    if let x = num1 {
        return x
    }
    else if let y = num2
    {
        return y
    }
    else
    {
        assert(false, "Both nil")
    }

}

是否断言,可能是您必须做出的实现选择。 如果您完全确定,则另一种方法是使其中一个不为nil,使函数的返回类型“隐式展开”。 我知道您想在两个都为nil时返回nil,但是随后必须检查此函数的返回值,该函数应该检查两个值并返回非nil的值,恕我直言,这没有什么意义,因此我尝试了这条路。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM