您可以将类型化数组传递给 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 将获得其新值
在 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 将获得其新值