设置" nil"在函数中子类化对象(使用inout)

时间:2015-03-27 09:39:29

标签: ios swift

在我的视图控制器中,我有一些视图(其中一些可能是零),在某些时候我想从superview中删除并将视图设置为nil。由于此操作必须在少数视图上执行,我想为此编写函数。视图可以是nil,因此必须为此准备函数。

(ps。我可以实现这个目标 - 删除视图 - 以其他方式,但我想在这里学习更多关于Swift的内容)

我已经创建了Playground文件来显示情况。

import UIKit

class ViewOne: UIView {

}

class ViewTwo: UIView {

}

var view1: ViewOne! = ViewOne()
var view2: ViewTwo! = ViewTwo()

func removeView(view: UIView!) {
    if view != nil {
        view.removeFromSuperview()
        //error: Cannot assign to 'let' value 'view'
        view = nil
    }
}

func removeViewVar(var view: UIView!) {
    if view != nil {
        view.removeFromSuperview()
        view = nil
    }
}

func removeViewInOut(inout view: UIView!) {
    if view != nil {
        view.removeFromSuperview()
        view = nil
    }
}

//this method does not set view1 to nil
removeViewVar(view1)

//error: 'ViewOne' is not identical to 'UIView'
removeViewInOut(&view1)
//error: 'UIView' is not convertible to 'inout UIView!'
removeViewInOut(&view1 as UIView)

view1

首先,我创建了简单的removeView方法。错误是显而易见的。

接下来的简单修改 - removeViewVar - 但是这个方法没有将原始对象设置为nil - 在阅读文档之后有意义,我可能应该在这里使用inout

但是 - 似乎我不能 - 呼叫removeViewInOut不想编译。

有人可以解释一下这里究竟不正确吗?以及如何解决?

1 个答案:

答案 0 :(得分:0)

输入类型中的问题必须准确。这样做是出于类型安全的原因。解决方案是generics

func removeView<T: UIView>(inout view: T!) {
    if view != nil {
        view.removeFromSuperview()
        view = nil
    }
}

class ViewOne: UIView {
}
var view1: ViewOne! = ViewOne()

removeView(&view1)
view1