gpt4 book ai didi

ios - CLBeacon 子类错误

转载 作者:行者123 更新时间:2023-11-30 12:27:25 26 4
gpt4 key购买 nike

我想通过 CLBeacon 传递一些额外的信息,因此我创建了一个名为 CLBeaconExtender 的子类。问题是在执行代码时,它给了我这个错误

NSArray element failed to match the Swift Array Element type

这是代码:

<小时/>

CLBeacon 的子类

class CLBeaconExtender: CLBeacon{
var id: String!
}
<小时/>

主类

class beaconController_1: UIViewController, CLLocationManagerDelegate {

var beacon_collection: UICollectionView!
var location_manager = CLLocationManager()
var beacon_manager = [CLBeaconExtender]()
var beacon_region = [CLBeaconRegion]()

// Other code that i don't paste

func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
if !beacons.isEmpty {
beacon_manager = beacons as! [CLBeaconExtender]
beacon_manager[0].id = "hello world" // here appear the error
beacon_collection.reloadData()
}
else{
if beacon_manager.count != 0 {
beacon_manager = beacons as! [CLBeaconExtender]
beacon_collection.reloadData()
}
}
}

谁能帮我解决这个问题或者给我举个例子吗?

编辑

我认为错误是由这一行引起的:

beacon_manager = beacons as! [CLBeaconExtender]

编辑2

对不起我的英语,我的目标是创建一个collectionview来显示我周围的所有信标,并在每次调用didRangBeacons时更新列表,此外每个collectionviewcell 应包含引用相应信标的特定文件音频。因此,当我点击特定信标的特定单元格时,它开始播放特定的声音。我的问题是处理 beacon_manager 数组。在 didRangeBeacons 的第一个周期中,一切顺利,因为 !beacon_manager.indices.contains(i) 返回 !false 因此它将执行 if 条件,它将填充所有 beacon_manager。与 didRangeBeacons 的第二个周期相比,if 条件将返回 !true,因此执行的代码将是 else 条件。这里执行时系统会崩溃 beacon_manager.remove(at: i) 其中 i 为 0 并且 beacon_manager[0] 存在。

崩溃向我显示了带有错误的 AppDelegate 类:

EXEC_BAD_ACCESS code=1 address= 0x8

希望您现在能理解。

   func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
if !beacons.isEmpty {
var i = 0
for beacon in beacons {
let bx = CLBeaconExtender(b: beacon, sID: "hello world")
if(!beacon_manager.indices.contains(i)){ //check if beacon_manager array exist at i if no create it, if yes update it
beacon_manager.insert(bx, at: i)
}
else{
beacon_manager.remove(at: i)
beacon_manager.insert(bx, at: i)

}
print(beacon_manager[i].id)
i+=1
}

print(beacon_manager.count,beacons.count)
beacon_collection.reloadData()
}
else{
if beacon_manager.count != 0 {
//do other things
}
}
}

最佳答案

你不能简单地说“这个对象现在是另一种类型”并神奇地改变该对象。例如:

    let x = UIView()
let y = x as! UIImageView

如果您尝试运行这两行,您会收到如下错误:

Could not cast value of type 'UIView' (0x107fa44c0) to 'UIImageView' (0x107fa5c08).

所以,这就是您在这里尝试做的事情:

beacon_manager = beacons as! [CLBeaconExtender]

您是在说“我声明这个 CLBeacon 对象的 NSArray 现在是 CLBeaconExtender 对象的数组!”,但事情并不是这样的。

您尝试执行的一种方法是将 CLBeaconExtender 类定义为:

class CLBeaconExtender: CLBeacon {
var id: String!
var bcn: CLBeacon!

convenience init(b: CLBeacon, sID: String) {
self.init()
bcn = b
id = sID
}
}

然后,在您的 didRangeBeacons 函数中:

func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {

for beacon in beacons {
let bx = CLBeaconExtender(b: beacon, sID: "hello world")
beacon_manager.append(bx)
}

// other code...
}

当然,您不会想要这样做,因为您最终会附加许多相同的信标对象,所有这些对象的 id 都是“hello world”。但是,希望这可以帮助您理解所遇到的错误,并帮助您修复它。

关于ios - CLBeacon 子类错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44002837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com