Swift中的NULL参数

时间:2016-11-12 07:52:01

标签: swift

在Objective-C中,我们可以声明一个这样的函数:

- (void)getRect:(CGRect *)aRectRef bRect:(CGRect *)bRectRef
{
    if (aRectRef) *aRectRef = CGRectZero
    if (bRectRef) *bRectRef = CGRectZero
}

并将NULL传递给函数:

CGRect rect;
[self getRect:NULL bRect:rect]

Swift中没有NULL。我不能直接使用nil作为inout param:

func getRect(aRect aRectRef: inout CGRect?, bRect bRectRef: inout CGRect?) -> Void {
    ...
}
self.getRect(&nil, bRect: rect) // <- ERROR

我必须定义一个带有nil值的变量并将其传递给函数,即使我完全不需要变量。

如何将nil传递给函数?

更新:

null / nil in swift language刚刚在Swift中解释了nil

Swift optional inout parameters and nil解释了如何使用nil值定义变量并将其作为inout参数传递。

我想知道有一种方法可以像&nil一样直接传递nil来运行。

2 个答案:

答案 0 :(得分:2)

你的Objective-C方法有可空指针作为参数, 在Swift 3中,它是一个可选的UnsafeMutablePointer

func getRect(aRectRef: UnsafeMutablePointer<CGRect>?, bRectRef: UnsafeMutablePointer<CGRect>?) {
    if let aRectPtr = aRectRef {
        aRectPtr.pointee = CGRect(x: 1, y: 2, width: 3, height: 4)
    }
    if let bRectPtr = bRectRef {
        bRectPtr.pointee = CGRect(x: 5, y: 6, width: 7, height: 8)
    }
}

var rect = CGRect.zero
getRect(aRectRef: &rect, bRectRef: nil)
print(rect) // (1.0, 2.0, 3.0, 4.0)

所以你可以传递nil作为参数。您可以做什么 (与Objective-C相反)是传递未初始化的变量的地址,rect必须在这里初始化。

同样可以更紧凑地写成

func getRect(aRectRef: UnsafeMutablePointer<CGRect>?, bRectRef: UnsafeMutablePointer<CGRect>?) {

    aRectRef.map { $0.pointee = CGRect(x: 1, y: 2, width: 3, height: 4) }
    bRectRef.map { $0.pointee = CGRect(x: 5, y: 6, width: 7, height: 8) }
}

答案 1 :(得分:0)

很抱歉,此时我暂时无法添加评论,所以我会将此作为答案。在SWIFT中,您将参数定义为inout,您必须传入变量而不是文字nil。你可以这样做,

func testGetRect()
    {
        var recta: CGRect? = nil
        var rectb: CGRect? = CGRect()

        self.getRect(aRect: &recta, bRect: &rectb)
    }

    func getRect(inout aRect aRectRef: CGRect?, inout bRect bRectRef: CGRect?) -> Void
    {
        if (aRectRef != nil)
        {
            aRectRef = CGRectZero
        }
        if (bRectRef != nil)
        {
            bRectRef = CGRectZero
        }

    }

是的,你“必须用nil定义一个变量并将其传递给函数。我尝试了一些转换以查看它是否有效,但是不能。通过inout传递的参数就像通过引用传递的C ++参数,即foo (int&amp; parama,int&amp; paramb)。你必须将变量传递给foo。我不相信SWIFT有参数传递,就像你拥有的obj-c例子一样。