CLBeacon子类错误
CLBeacon subclass error
我想通过 CLBeacon
传递一些额外的信息,所以我创建了一个名为 CLBeaconExtender
的子class。问题是在执行代码时,它给了我这个错误
NSArray element failed to match the Swift Array Element type
这是代码:
CLBeacon
的子class
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 条件将 return !true
因此执行的代码将是 else
条件。这里系统会崩溃执行
beacon_manager.remove(at: i)
其中 i
为 0 且 beacon_manager[0] 存在。
崩溃显示 AppDelegate class 错误:
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
}
}
}
类型问题:-
1) Array
是一个结构,因此,它是Swift中的值类型。
2) NSArray
是不可变的 Objective-C class 因此,它是一个引用类型。
你不能简单地说 "this object is now another type" 然后神奇地改变对象。例如:
let x = UIView()
let y = x as! UIImageView
如果您尝试 运行 这两行,您会收到如下错误:
Could not cast value of type 'UIView' (0x107fa44c0) to 'UIImageView' (0x107fa5c08).
那么,这就是您要在此处尝试执行的操作:
beacon_manager = beacons as! [CLBeaconExtender]
你说的是 "I declare this NSArray of CLBeacon objects is now an Array of CLBeaconExtender objects!" 但事实并非如此。
一种方法是将您的 CLBeaconExtender class 定义为:
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"。但是,希望这能帮助您理解您遇到的错误,并让您着手解决它。
我想通过 CLBeacon
传递一些额外的信息,所以我创建了一个名为 CLBeaconExtender
的子class。问题是在执行代码时,它给了我这个错误
NSArray element failed to match the Swift Array Element type
这是代码:
CLBeacon
的子classclass 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 条件将 return !true
因此执行的代码将是 else
条件。这里系统会崩溃执行
beacon_manager.remove(at: i)
其中 i
为 0 且 beacon_manager[0] 存在。
崩溃显示 AppDelegate class 错误:
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
}
}
}
类型问题:-
1) Array
是一个结构,因此,它是Swift中的值类型。
2) NSArray
是不可变的 Objective-C class 因此,它是一个引用类型。
你不能简单地说 "this object is now another type" 然后神奇地改变对象。例如:
let x = UIView()
let y = x as! UIImageView
如果您尝试 运行 这两行,您会收到如下错误:
Could not cast value of type 'UIView' (0x107fa44c0) to 'UIImageView' (0x107fa5c08).
那么,这就是您要在此处尝试执行的操作:
beacon_manager = beacons as! [CLBeaconExtender]
你说的是 "I declare this NSArray of CLBeacon objects is now an Array of CLBeaconExtender objects!" 但事实并非如此。
一种方法是将您的 CLBeaconExtender class 定义为:
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"。但是,希望这能帮助您理解您遇到的错误,并让您着手解决它。