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"。但是,希望这能帮助您理解您遇到的错误,并让您着手解决它。