【问题标题】:Can you pass a typed array to a function within an enum in swift?您可以将类型化数组快速传递给枚举中的函数吗?
【发布时间】:2015-05-15 11:52:10
【问题描述】:

在一个 Swift 应用程序中,我创建了一个带有一个函数的枚举,该函数将一个 CLBeacon 对象数组作为它的唯一参数(即[CLBeacon])。我没有遇到枚举错误,但是当我尝试使用枚举时,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{$0.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语句中的代码暂时不相关,尚未确定,但为什么调用时出错?

【问题讨论】:

标签: function swift enums arguments


【解决方案1】:

您的代码的问题是您正在静态调用 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 就会得到它的新值

【讨论】:

  • 是的,感谢您和 Martin R。我知道我尝试将其作为实例方法调用,但仍然遇到相同的错误。然而这一次,将它作为实例方法调用确实有效。您是否注意到 Clang 有时在使用 Swift 更新其错误消息时会非常奇怪?我使用“mutating”是因为我打算在继续完成该功能时更改 check() 中的状态。
猜你喜欢
  • 2014-12-15
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多