我是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的值必须是ArrayCGFloat值。无需检查。
好的下一步:当你说
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/

10-11 23:05
查看更多