2014-09-30 111 views
0

我使用AVCaptureSession来扫描Swift应用程序中的QR码。我想围绕检测到的QR代码绘制一个框,但我无法将AVMetadataMachineReadableCodeObject的“角落”属性转换为可用的东西。Swift中的CGPointMakeWithDictionaryRepresentation

var corners:[AnyObject]! {得到}

该属性的值是CFDictionary对象的数组,其中每个 的已从CGPoint结构使用 CGPointCreateDictionaryRepresentation功能,相对于表示所述对象的角部的 坐标创建它所在的 中的图像。

我已经试过这(根据project by werner77),但我得到以下编译器错误“'CGPoint?不等同于“CGPoint””

// MARK: - AVCaptureMetadataOutputObjectsDelegate 
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { 

    let metadataObject = metadataObjects[0] as AVMetadataMachineReadableCodeObject; 
    var corners = metadataObject.corners as Array<NSDictionary>; 
    var topLeftDict = corners[0] as NSDictionary; 
    var topLeft : CGPoint? 

    // COMPILE ERROR: 'CGPoint?' is not identical to 'CGPoint' 
    CGPointMakeWithDictionaryRepresentation(topLeftDict, &topLeft) 
} 

任何帮助,将不胜感激。

回答

0

您通过了UnsafeMutablePointer<Optional<CGPoint>>,但它想要一个UnsafeMutablePointer<CGPoint>

var topLeft: CGPoint? 
var point = CGPointZero 
if CGPointMakeWithDictionaryRepresentation(topLeftDict, &point) { 
    topLeft = point 
} 
1

了解自选

任何类型都可以附加?,这意味着它也可以是nil。关于这一点的好处是,您必须明确地解决或忽略nil对象,而不像Objective-C中的对象可能导致无法跟踪的错误。

从字典中获取对象时,它必须是可选的,因为字典中可能没有该键。 CGPointMakeWithDictionaryRepresentation预计为非可选项,因此您必须使用已初始化的非选项

// Playground: 
var point = CGPointMake(1, 2) 
var dictionary = CGPointCreateDictionaryRepresentation(point) 
var aPoint = CGPointZero 
CGPointMakeWithDictionaryRepresentation(dictionary, &aPoint) 
aPoint // x 1, y 2 
0

试试这个片断:

let corners = metadataObject.corners.map{(point)->CGPoint in 
       let dict = point as! NSDictionary 
       let x = dict["X"]!.doubleValue 
       let y = dict["Y"]!.doubleValue 

       return CGPoint(x: x, y: y) 
      }