CLBeacon子类错误

时间:2017-05-16 13:26:38

标签: ios swift subclassing clbeacon

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

  

NSArray元素无法匹配Swift数组元素类型

这是代码:

CLBeacon的子类

class CLBeaconExtender: CLBeacon{
    var id: String!
}

MainClass

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时更新列表,此外每collectionviewcellbeacon_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;
?>

2 个答案:

答案 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。但是,希望这有助于您了解所获得的错误,并帮助您解决问题。