【问题标题】:Swift watchOS 2 - CMSensorDataListSwift watchOS 2 - CMSensorDataList
【发布时间】:2015-09-15 02:00:30
【问题描述】:

简短:我不知道如何从 CMSensorRecorder 中获取 CMSensorDataList 中的 CMRecordedAccelerometerData。 Apple 尚未提供任何文档。

也许有人对我有提示? ;)

func startMovementDetection(){
    var accDataList = self.cmSensorRecorder!.accelerometerDataFrom(self.startDate, to: NSDate()) as CMSensorDataList

    CMRecordedAccelerometerData() //that's the class i want to extract from CMSensorDataList
}

好的,问题在这里解决了:NSFastEnumeration in Swift

在 Swift 3.0 中,它变为:

extension CMSensorDataList: Sequence {
    public func makeIterator() -> NSFastEnumerationIterator {
        return NSFastEnumerationIterator(self)
    }
}

【问题讨论】:

  • 你有sn-p码吗

标签: swift core-motion watchos-2


【解决方案1】:
//First make the extension tu use enumerate in the for-in loop
extension CMSensorDataList: SequenceType {
    public func generate() -> NSFastGenerator {
        return NSFastGenerator(self)
    }
}

//Now you can query the recorded data
func printData(){
    let date = NSDate()
    let recorder = CMSensorRecorder()
    let sensorData: CMSensorDataList = recorder.accelerometerDataFromDate(initialDate!, toDate: date)!

    for (index, data) in sensorData.enumerate() {
        print(index, data)
    }
}

【讨论】:

    【解决方案2】:

    这是一种 Swift 4 方法。首先,您需要通过扩展使 CMSensorDataList 符合 Sequence:

    extension CMSensorDataList: Sequence {
        public typealias Iterator = NSFastEnumerationIterator
        public func makeIterator() -> NSFastEnumerationIterator {
            return NSFastEnumerationIterator(self)
        }
    }
    

    现在您可以遍历 CMSensorDataList 以获得 CMRecordedAccelerometerData 实例,每个实例由一个timestamp 和一个acceleration 组成:

    let rec = CMSensorRecorder() // and d1 and d2 are Dates
    if let list = rec.accelerometerData(from: d1, to: d2) {
        for datum in list {
            if let accdatum = datum as? CMRecordedAccelerometerData {
                let accel = accdatum.acceleration
                let t = accdatum.timestamp
                // do something with data here
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      马库斯在 Swift 4 中的回答:

      //First make the extension to use enumerate in the for-in loop
      extension CMSensorDataList: Sequence {
          public typealias Iterator = NSFastEnumerationIterator
      
          public func makeIterator() -> NSFastEnumerationIterator {
              return NSFastEnumerationIterator(self)
          }
      }
      
      //Now you can query the recorded data
      func printData(){
          let date = Date()
          let recorder = CMSensorRecorder()
            let accelerometerData = recorder.accelerometerData(from: startDate, to: endDate)
      
           for (index, data) in (accelerometerData?.enumerated())! {
                          print(index, data)
            }
      }
      

      【讨论】:

      • Swift 4 中没有 SequenceType。这无法编译。
      • 只是序列,见修正答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      相关资源
      最近更新 更多