繁体   English   中英

Swift错误消息:用于条件绑定的初始化程序必须具有可选类型,而不是“ [CLBeacon]”

[英]Swift Error Message: Initializer for conditional binding must have Optional type, not '[CLBeacon]'

一直在这里搜索论坛和Swift文档,但仍然陷于困境。 我正在跟着教程学习 ,总体上还不错,但是现在进入最后阶段,并抛出一个错误:

条件绑定的初始化程序必须具有可选类型,而不是“ [CLBeacon]”。

我已经尝试过这里发布的所有解决方案,但仍然没有任何运气。 这个特定的教程/代码片段的任何帮助都将非常棒。 这是代码:

//
//  ViewController.swift
//  BeaconSpot
//
//  Created by Gabriel Theodoropoulos on 10/3/15.
//  Copyright (c) 2015 Appcoda. All rights reserved.
//

import UIKit
import QuartzCore
import CoreLocation

class ViewController: UIViewController,CLLocationManagerDelegate {
    var beaconRegion: CLBeaconRegion!
    var locationManager: CLLocationManager!
    var isSearchingForBeacons = false
    var lastFoundBeacon: CLBeacon! = CLBeacon()
    var lastProximity: CLProximity! = CLProximity.Unknown

    @IBOutlet weak var btnSwitchSpotting: UIButton!
    @IBOutlet weak var lblBeaconReport: UILabel!
    @IBOutlet weak var lblBeaconDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager = CLLocationManager()
        locationManager.delegate = self

        let uuid = NSUUID(UUIDString: "6E400001-B5A3-F393-E0A9-E50E24DCCA9E")
        beaconRegion = CLBeaconRegion(proximityUUID: uuid!, identifier: "com.appcoda.beacondemo")

        beaconRegion.notifyOnEntry = true
        beaconRegion.notifyOnExit = true

        // Do any additional setup after loading the view, typically from a nib.

        lblBeaconDetails.hidden = true
        btnSwitchSpotting.layer.cornerRadius = 30.0
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: IBAction method implementation

    @IBAction func switchSpotting(sender: AnyObject) {
        if !isSearchingForBeacons {
            locationManager.requestAlwaysAuthorization()
            locationManager.startMonitoringForRegion(beaconRegion)
            locationManager.startUpdatingLocation()

            btnSwitchSpotting.setTitle("Stop Spotting", forState: UIControlState.Normal)
            lblBeaconReport.text = "Spotting beacons..."
        }
        else{
            locationManager.stopMonitoringForRegion(beaconRegion)
            locationManager.stopRangingBeaconsInRegion(beaconRegion)
            locationManager.stopUpdatingLocation()

            btnSwitchSpotting.setTitle("Start Spotting", forState: UIControlState.Normal)
            lblBeaconReport.text = "Not running"
            lblBeaconDetails.hidden = true
        }

        isSearchingForBeacons = !isSearchingForBeacons
    }

    func locationManager(manager: CLLocationManager, didStartMonitoringForRegion region: CLRegion) {
        locationManager.requestStateForRegion(region)
    }

    func locationManager(manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion) {
        if state == CLRegionState.Inside {
            locationManager.startRangingBeaconsInRegion(beaconRegion)
        }
        else {
            locationManager.stopRangingBeaconsInRegion(beaconRegion)
        }
    }

    func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) {
        lblBeaconReport.text = "Beacon in range"
        lblBeaconDetails.hidden = false
    }

    func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) {
        lblBeaconReport.text = "No beacons in range"
        lblBeaconDetails.hidden = true
    }

    func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
        var shouldHideBeaconDetails = true

        if let foundBeacons = beacons {
            if foundBeacons.count > 0 {
                if let closestBeacon = foundBeacons[0] as? CLBeacon {
                    if closestBeacon != lastFoundBeacon || lastProximity != closestBeacon.proximity  {
                        lastFoundBeacon = closestBeacon
                        lastProximity = closestBeacon.proximity

                        var proximityMessage: String!
                        switch lastFoundBeacon.proximity {
                        case CLProximity.Immediate:
                            proximityMessage = "Very close"

                        case CLProximity.Near:
                            proximityMessage = "Near"

                        case CLProximity.Far:
                            proximityMessage = "Far"

                        default:
                            proximityMessage = "Where's the beacon?"
                        }

                        shouldHideBeaconDetails = false

                        lblBeaconDetails.text = "Beacon Details:\nMajor = " + String(closestBeacon.major.intValue) + "\nMinor = " + String(closestBeacon.minor.intValue) + "\nDistance: " + proximityMessage
                    }
                }
            }
        }

        lblBeaconDetails.hidden = shouldHideBeaconDetails
    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        print(error)
    }

   func locationManager(manager: CLLocationManager?!, monitoringDidFailForRegion region: CLRegion!, withError error: NSError!) {
        print(error)
    }

    func locationManager(manager: CLLocationManager!, rangingBeaconsDidFailForRegion region: CLBeaconRegion!, withError error: NSError!) {
        print(error)
    }
}

您正在尝试安全地打开beacons ,就好像它是可选的一样:

if let foundBeacons = beacons {

但是beacons 不是可选的,因为locationManager方法签名指定:

func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {

因此, beaconsCLBeacon对象的数组: [CLBeacon] ,它不是Optional数组。

只是在这种情况下不要使用if let ,而直接使用beacons

func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {

    var shouldHideBeaconDetails = true

    if beacons.count > 0 {

        if let closestBeacon = beacons[0] as? CLBeacon {

当然可以相应地修改其余代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM