[英]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.