我是swift的新手(大约一个月前就学会了),我正在创建一个自定义的uiCollectionViewCell类,我还需要三种类型的uiButtons和其他对象,但我不想把每一种都写出来,所以我正在创建一个函数。但是,由于我有三个按钮,函数必须为每个参数取三个数组。有人能帮我把注释放在代码里吗?谢谢您!
var buttonArray: [UIButton] = []
var checkBoxArray: [UIView] = []
var labelArray: [UILabel] = []
func initializeStuff(objectType: AnyObject, xOriginCgFloat: [CGFloat], yOriginCgFloat: [CGFloat], width: [CGFloat], height: [CGFloat]) {
if xOriginCgFloat != Array() || yOriginCgFloat != Array() || width != Array() || height != Array() {
fatalError("Each CgFloat parameter must be an array.")
} else {
if AnyObject.self == UIButton.self {
if condition { //condition: each array must contain exactly three values
for index in 0..<3 {
var button = UIButton(frame: CGRect.init(origin: CGPoint.init(x: xOriginCgFloat[index], y: yOriginCgFloat[index]), size: CGSize.init(width: width[index], height: height[index])))
buttonArray.append(button)
}
} else {
fatalError("Each array for a button object must have exactly three values.")
}
} else if AnyObject.self == UIView.self {
if condition2 { //condition2: each array must contain exactly two values
for index in 0..<2 {
var checkBox = UIView(frame: CGRect.init(origin: CGPoint.init(x: xOriginCgFloat[index], y: yOriginCgFloat[index]), size: CGSize.init(width: width[index], height: height[index])))
checkBoxArray.append(checkBox)
}
} else {
fatalError("Each array for a view object must have exactly two values.")
}
} else if AnyObject.self == UILabel.self {
if condition3 { //condition3: each array must contain exactly two values
for index in 0..<2 {
var label = UILabel(frame: CGRect.init(origin: CGPoint.init(x: xOriginCgFloat[index], y: yOriginCgFloat[index]), size: CGSize.init(width: width[index], height: height[index])))
labelArray.append(label)
}
} else {
fatalError("Each array for a view object must have exactly two values.")
}
} else {
fatalError("Incorrect type of object; AnyObject parameter must be a UIButton, UIView, or UILabel.")
}
}
}
最佳答案
这里发生了很多事。首先,检查参数是否为数组的方式不起作用:
if xOriginCgFloat != Array() {
Array()
声明一个Array
类型的新对象,并检查xorigingcfloat是否等于它。相反,您需要检查xorigingcfloat是否属于Array
类型,您可以这样做:if xOriginCgFloat is Array {
但是!你不需要这么做。函数声明指定了
xOriginCgFloat: [CGFloat]
,这意味着要运行函数,传递给xOriginCgFloat
的值必须是Array
的CGFloat
值。无需检查。好的下一步:当你说
if AnyObject.self == UIButton.self {
您可能认为您正在检查传递给
ObjectType
的值是否为UIButton
。但你不是。这实际上是在检查类AnyObject
是否与类UIButton
相同,但它不是这样的,所以这将始终返回false。相反,您可以执行以下检查:if objectType === UIButton.self {
如果在调用函数时为
UIButton.self
传递objectType
,这将成功,我认为这是您的意图。最后,您的实际问题是:如果您想知道
xOriginCgFloat
数组有多少元素,可以使用xOriginCgFloat.count
:if xOriginCgFloat.count == 2 {
这是可行的,但这不是一种理想的方法,因为它不支持编译时检查;如果在程序中的某个地方传递的数组的值数目错误,编译器将无法捕获它。直到程序运行时你才会发现,也许是在一个非常糟糕的时刻。
相反,如果知道要查找的值的数目,请使用元组。可以声明如下函数:
func initializeStuff(xOriginCgFloat: (CGFloat, CGFloat)) {
这样称呼:
initializeStuff(xOriginCgFloat: (5.0, 6.7))
它需要一个内部正好有两个
CGFloats
的元组,因此如果您尝试用其他任何方法调用,它将在ide中显示一个错误。当您的函数被调用时,您不需要检查,因为您得到的保证正是您想要的值。元组的缺点是你不能用for循环来迭代它们(实际上you can,但是很混乱),所以你必须手工操作。因为在元组中只有两个或三个项,所以这可能不是一个坏方法。例如:
let xOriginCgFloat:(CGFloat, CGFloat) = (4, 6)
var floats = [CGFloat]()
floats.append(xOriginCgFloat.0)
floats.append(xOriginCgFloat.1)
for float in floats {
// process xOriginCgFloat member here
}
您可以阅读Apple's documentation中的元组。
关于arrays - 如何检查作为UDF参数的数组中的值数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45494236/