我想传递一些额外的信息,CLBeacon
所以我创建了一个名为CLBeaconExtender
. 问题是在执行代码时,它给了我这个错误
NSArray 元素无法匹配 Swift Array 元素类型
这是代码:
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)
return!false
所以它将执行if
条件,并将填充所有beacon_manager
. 比在didRangeBeacons
if 条件的第二个循环中将返回!true
,因此执行的代码将是else
条件。这里系统将在执行
beacon_manager.remove(at: i)
where i
is 0 和 beacon_manager[0] 存在时崩溃。
崩溃向我展示了带有错误的 AppDelegate 类:
EXEC_BAD_ACCESS 代码=1 地址= 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
}
}
}