我想通过CLBeacon
传递一些额外的信息,所以我创建了一个名为CLBeaconExtender
的子类。问题是在执行代码时,它给了我这个错误
NSArray元素无法匹配Swift数组元素类型
这是代码:
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]
对不起我的英文,我的目标是创建一个显示我周围所有信标的collectionview
,并在每次调用didRangBeacons
时更新列表,此外每collectionviewcell
个beacon_manager
应包含指向相应信标的特定文件音频。因此,当我点击特定信标的特定单元时,它开始播放特定声音。我的问题是处理didRangeBeacons
数组。在!beacon_manager.indices.contains(i)
的第一个周期中,一切都很顺利,因为!false
返回if
所以它将执行beacon_manager
条件,并且它将填充所有didRangeBeacons
。与!true
的第二个周期相比,if条件将返回else
,因此执行的代码将是beacon_manager.remove(at: i)
条件。这里系统会崩溃执行
i
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
}
}
}
为0且beacon_manager [0]存在。
崩溃向AppDelegate类显示错误:
EXEC_BAD_ACCESS代码= 1地址= 0x8
希望你现在明白了。
<?php
$shippingtimearr = array("", "1630", "1530", "1530", "1530", "", "");
$counter = 0;
for($i=0;$i<count($shippingtimearr);$i++){
if($shippingtimearr[$i]=="")
$counter++;
}
echo $counter;
?>
答案 0 :(得分:0)
类型的问题: -
1)Array
是结构,因此,它是Swift中的值类型。
2)NSArray
是一个不可变的 Objective-C类因此,它是一个引用类型。
答案 1 :(得分:0)
你不能简单地说&#34;这个对象现在是另一种类型&#34;并神奇地改变对象。例如:
let x = UIView()
let y = x as! UIImageView
如果您尝试运行这两行,则会收到如下错误:
无法投放类型的价值&#39; UIView&#39; (0x107fa44c0)到&#39; UIImageView&#39; (0x107fa5c08)。
那么,那就是你要在这里做的事情:
beacon_manager = beacons as! [CLBeaconExtender]
你说的是 &#34;我声明这个CLBeacon对象的NSArray现在是一个CLBeaconExtender对象的数组!&#34; 而且事情只是没有&#39;这样工作。
您尝试做的一种方法是将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...
}
当然,你不会想要这样做,因为你最终会附加很多相同的灯塔对象,所有这些都是&#34; hello world&#34;的id。但是,希望这有助于您了解所获得的错误,并帮助您解决问题。