您可以将类型化数组传递给 swift 中枚举中的函数吗?

Can you pass a typed array to a function within an enum in swift?

在 Swift 应用程序中,我创建了一个枚举,其中包含一个将 CLBeacon 对象数组作为唯一参数(即 [CLBeacon])的函数。我没有收到枚举的 clang 错误,但是当我尝试使用枚举时,clang 抱怨我无法使用参数列表 ([CLBeacon]) 调用该函数。这是代码:

enum BeaconArrayState {

    case NoObjectOnScreen, FirstObjectOnScreen, FirstObjectOffScreen

    mutating func check(beacons: [CLBeacon]) -> BeaconArrayState {

        switch self {

            case FirstObjectOnScreen:
                return .FirstObjectOnScreen
            case FirstObjectOffScreen:
                return .FirstObjectOffScreen
            case NoObjectOnScreen:
                if beacons.count > 0 {
                    println("push to screen associated with beacon \(beacons[0].minor)")
                }
                return .NoObjectOnScreen
        }
    }
}
var beaconArrayState: BeaconArrayState = .NoObjectOnScreen

func beaconManager(manager: AnyObject!, didRangeBeacons beacons: [AnyObject]!, inRegion region: CLBeaconRegion!) {
    let knownBeacons = beacons.filter{[=11=].proximity != CLProximity.Unknown}
    //send updated beacons array to perform parseBeacons
    NSNotificationCenter.defaultCenter().postNotificationName("updateNotificationPriorities", object: knownBeacons)

    beaconArrayState = BeaconArrayState.check(knownBeacons as [CLBeacon])
}

这给出了:错误 - Cannot invoke 'check' with argument list of type '([CLBeacon])'

case语句中的代码暂时无关,尚未确定,但为什么调用时出错?

您的代码存在的问题是您静态调用 check 方法,而该函数根本不是静态的。还要检查函数它不是一个变异函数,所以你不需要变异关键字。为了使这项工作有效,请进行以下更改 beaconArrayState = beaconArrayState.check(knownBeacons as [CLBeacon]) 或者如果您希望检查方法自身发生变异,请像这样更改它:

mutating func check(beacons: [CLBeacon]) {

    switch self {

    case FirstObjectOnScreen:
        self = .NoObjectOnScreen
    case FirstObjectOffScreen:
        self = .FirstObjectOffScreen
    case NoObjectOnScreen:
        if beacons.count > 0 {
            println("push to screen associated with beacon \(beacons[0].minor)")
        }
        self = .NoObjectOnScreen
    }
}

然后只需调用 beaconArrayState.check(knownBeacons as [CLBeacon]) 并且 becaonArrayState 将获得其新值