2017-12-29 20 views
0

APIからデータを正しく取り出してデコードし、アルゴリズムに使用する必要のあるすべてのデータにアクセスできるようになりました。APIからのデコードされたデータをアルゴリズムに使用する

デコード後にこのデータにアクセスする方法がわかりません。デコード後すぐに印刷できますが、別の機能や場所でアプリを使用する方法がわかりません。ここで

は私の遊び場です:

import PlaygroundSupport 

PlaygroundPage.current.needsIndefiniteExecution = true 

enum MyError : Error { 
    case FoundNil(String) 
} 

struct Level: Codable { 
    let time: Double 
    let close: Double 
    let high: Double 
    let low: Double 
    let open: Double 
} 

struct Response: Codable { 
    let data: [Level] 

    private enum CodingKeys : String, CodingKey { 
     case data = "Data" 
    } 
} 

func fetchData(completion: @escaping (Response?, Error?) -> Void) { 
    let url = URL(string: "https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG")! 

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
     guard let data = data else { return } 
     do { 
      if let marketData = try? JSONDecoder().decode(Response.self, from: data) { 
       print(marketData.data[0].open) 
       print(marketData.data[1].open) 
       print("Average=", (marketData.data[0].open + marketData.data[1].open)/2) 
       //completion(marketData, nil) 
       throw MyError.FoundNil("data") 
      } 
     } catch { 
      print(error) 
     } 
    } 
    task.resume() 
} 

fetchData() { items, error in 
    guard let items = items, 
     error == nil else { 
      print(error ?? "Unknown error") 
      return 
    } 
    print(items) 
} 

は、どのように私は.dataセクションを使用することができます[0]、.dataの[1]、...、どこか?

+0

することができます別の場所を定義してください –

+0

別のファイルまたは関数と同様 – Wizzardzz

答えて

1

だけcompletion(marketData, nil)

この行のコメントを解除し、あなたがここに必要なすべてを書かれているので、私は、あなたの本当の問題が何であるかを理解していない、しかし限り、私は理解して、データに

を渡すためにそして

fetchData() { items, error in 
    guard let items = items, 
     error == nil else { 
      print(error ?? "Unknown error") 
      return 
    } 
    print(items) 
} 

itemsであなたのstruct Responseの目的です。例えば

var items : Response! 

class SomeOtherClass : NSObject{ 
    var items : Response! 
func printSomeData() 
{ 
print(items.data[0].open) 
print(items.data[1].open) 
print("Average=", (items.data[0].open + items.data[1].open)/2) 
} 
    } 

fetchData方法でこれを書く:あなただけのような別の変数を作成することによって、あなたの他のclassにこのどこかを渡すことができ

fetchData() { items, error in 
      guard let items = items, 
       error == nil else { 
        print(error ?? "Unknown error") 
        return 
      } 
      let otherObject = SomeOtherClass() 
    otherObject.items = items 
otherObject.printSomeData() 
     } 
+0

これは私が探していたものです!ありがとうたくさんのアルン! – Wizzardzz

+0

お寄せいただきありがとうございます。 :) –

2

お客様のデータはfecthData()コールでご利用になれます。おそらくあなたが望むものは、あなたが印刷している変数itemsです。ただし、fetchDataの実装で補完を呼び出すようにしてください。

警告:未テストのコード。

import PlaygroundSupport 

PlaygroundPage.current.needsIndefiniteExecution = true 

enum MyError: Error { 
    case FoundNil(String) 
    case DecodingData(Data) 
} 

struct Level: Codable { 
    let time: Double 
    let close: Double 
    let high: Double 
    let low: Double 
    let open: Double 
} 

struct Response: Codable { 
    let data: [Level] 

    private enum CodingKeys : String, CodingKey { 
     case data = "Data" 
    } 
} 

func fetchData(completion: @escaping (Response?, Error?) -> Void) { 
    let url = URL(string: "https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG")! 

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
     guard let data = data else { 
      completion(nil, MyError.FoundNil("data")) 
     } 

     do { 
      if let marketData = try? JSONDecoder().decode(Response.self, from: data) { 
       completion(marketData, nil) 
      } else { 
       completion(nil, MyError.DecodingData(data)) // work on this duplicated call 
      } 
     } catch { 
      completion(nil, MyError.DecodingData(data)) // work on this duplicated call 
     } 
    } 

    task.resume() 
} 

fetchData() { items, error in 
    if let error == error { 
     switch(error) { 
      case .foundNil(let whatsNil): 
       print("Something is nil: \(whatsNil)") 
      case .decodingData(let data): 
       print("Error decoding: \(data)") 
     } 
    } else { 
     if let items = items { 
      print(items.data[0].open) 
      print(items.data[1].open) 
      print("Average=", (items.data[0].open + items.data[1].open)/2) 

      print(items) 
     } else { 
      print("No items to show!") 
     } 
    } 
} 
+0

ありがとう!私は参照のためにこの方法をプレイグラウンドに保ちます、それは完全に動作します – Wizzardzz

関連する問題