在我的视图控制器中,我有一些视图(其中一些可能是零),在某些时候我想从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
不想编译。
有人可以解释一下这里究竟不正确吗?以及如何解决?
答案 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