私のアプリは現在、AWS API GatewayとAlamofireを使用して、バックエンドとして機能するさまざまなラムダ関数にアクセスしています。
次のコードを使用しているため、これらのAPIエンドポイントの1つにパラメーターの1つとして配列を送信する必要があります。
var interests : [String]
interests = globalInterests.map({ (interest) -> String in
return interest.id!
})
// Parameters needed by the API
let parameters: [String: AnyObject] = [
"name" : name,
"lastName" : lastName,
"interests" : interests
]
// Sends POST request to the AWS API
Alamofire.request(.POST, url, parameters: parameters, encoding: .JSON).responseJSON { response in
// Process Response
switch response.result {
case .Success:
print("Sucess")
case .Failure(let error):
print(error)
}
}
しかし、配列がAPIによって認識されていないため、それは機能していませんが、「静的」配列を作成した場合
let interests = ["a", "b", "c"]
すべてが想定どおりに機能します。
対象の配列がコードの別の部分からのものである場合、この状況をどのように修正できますか?どのように宣言または構築する必要がありますか?
友人はAndroid
ArrayList<String>
編集:
パラメータ配列を印刷すると、次のことがわかります。
["name":test, "interests": <_TtCs21_SwiftDeferredNSArray 0x7b05ac00>( 103, 651, 42), "lastName": test]
AnyObjectは、クラスタイプのみを表すことができます。 Swiftでは、配列と辞書は、他の多くの言語のクラスタイプではなく、構造体です。構造体をAnyObjectに記述できないため、Anyが登場します。クラスの他に、Anyは構造体や列挙型を含む他のすべての型でも利用できます。
したがって、キャスト配列または辞書をAnyObjectに入力すると、_TtCs21_SwiftDeferredNSArrayエラーが発生します。したがって、AnyObjectではなくAnyを実行する必要があります。
let parameters: [String: Any] = [
"name" : name,
"lastName" : lastName,
"interests" : interests
]
NSJSONSerializationを使用してJSONをエンコードすることで、Alamofireで使用するための独自のNSURLRequestを作成できます。ここにSwiftの例を示します。
//creates the request
var request = URLRequest(url: try! "https://api.website.com/request".asURL())
//some header examples
request.httpMethod = "POST"
request.setValue("Bearer ACCESS_TOKEN_HERE",
forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Accept")
//parameter array
let values = ["value1", "value2", "value3"]
request.httpBody = try! JSONSerialization.data(withJSONObject: values)
//now just use the request with Alamofire
Alamofire.request(request).responseJSON { response in
switch (response.result) {
case .success:
//success code here
case .failure(let error):
//failure code here
}
}
}
問題は、配列を宣言したばかりで、初期化していないことです。これにより、データを挿入しようとしても、インタレスト配列がnilになります。書いてみてください
var interests = [String]()
の代わりに
var interests : [String]
let ValueArray = ["userid":name、 "password":password]
pass ValueArray [parameters:ValueArray]は、APIによって受け入れられたエンコーディングも検証します。
配列内のIDが重複していることが問題であることが判明しました。 APIの背後にあるコードは、エラーとして返送されなかった例外をスローしました。
他のすべての答えは正しいです、私は問題を見つけた後にそれらをテストしました、そしてすべてがうまくいったので、私はそれらに賛成票を投じるつもりです。
どうもありがとうございました。