1
私はどこでもスコープしたい変数tbの宣言についてちょっと混乱します。この変数はJSONから来ます。どのように私の配列をすべてのスコープに初期化するのですか
私が直接JSON
var tb = json as! Array<Dictionary<String, Any>>
からそれが働いてのinitが、それはのtableView関数にスコープいない場合。
私はまだ素早い初心者ですから、誰かが私に説明することができたらどうすればいいですか?このスコープと変数init/typeがどのように働いているのか、私はとても感謝しています。
ここでは、コードです:
class BiensViewController: UIViewController {
@IBOutlet weak var maTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
var user = ""
var tb:[Dictionary<String, Any>]
super.viewDidLoad()
//on récupère l'utilisateur courant.
let fm = FileManager.default
let urlRepDocuments = try! fm.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let url = urlRepDocuments.appendingPathComponent("user.plist")
print(url)
if let dico = NSMutableDictionary.init(contentsOfFile: url.path){
if dico["email"] != nil {
user = dico["email"] as! String
}
}
let parameters = ["email": user]
//
guard let httpUrl = URL(string: "https://mysite.000webhostapp.com/services")else{return}
var request = URLRequest(url: httpUrl)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else { return }
request.httpBody = httpBody
let session = URLSession.shared
session.dataTask(with: request) { (data, response, error) in
if let response = response {
print("******")
print(response)
}
let json:Any
if let data = data {
do {
json = try JSONSerialization.jsonObject(with: data, options: [])
//print(json)
tb = json as! Array<Dictionary<String, Any>>
print(tb)
} catch {
print(error)
}
}
}.resume()
func numberOfSections(in tableView: UITableView) -> Int
{
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return tb.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
//Récupéré une cellule réutilisable
let cellule:BiensTableViewCell = tableView.dequeueReusableCell(withIdentifier: "maCellulePersonnalise", for: indexPath)
as! BiensTableViewCell
//peuple la cellule
cellule.etqRef.text = tb[indexPath.row]["ref"] as? String
cellule.EtqAdresse.text = tb[indexPath.row]["adresse"] as? String
cellule.etqCP.text = tb[indexPath.row]["cp"] as? String
cellule.etqVille.text = tb[indexPath.row]["ville"] as? String
cellule.etqNomLoc.text = tb[indexPath.row]["nom"] as? String
cellule.etqLoyer.text = tb[indexPath.row]["loyer"] as? String
return cellule
}}}
エラーは次のとおりです。
閉鎖によって捕獲変数 'TB' あなたはただのviewDidLoad(外変数を宣言する必要が
こんにちは、ありがとうございます。しかし、私は最終的にそれらの '()'がエラーを消滅させる理由を理解していませんか?それはコンストラクタのようなものですか?しかしそれは関数ではなく、単に配列宣言です。 AnyObjectまたはAny(いずれかより優れていますか?)任意のカバーAnyObject?私はAnyObjectがanyにincluedされていることを意味しますか?私はAnyObjectがオブジェクトのためのものであることを意味しますか?私は正しい? :p – BenoHiT
こんにちは、 まず、()の使用はオブジェクト指向プログラミングなのでエラーが消えます。素早く、使用する前に変数を初期化しなければならず、初期化するためには、 - > var tb:[Dictionary]? そして、その型を与える場合、最後にplace()を置く必要はありませんが、=演算子を使用して値を代入すると、初期値でそれを割り当てるclass配列のinitメソッドを間接的に呼び出しています。したがって、クラスのコンストラクタを呼び出すには、最後に()を配置します。 –
Ishika
また、AnyObjectまたはAnyについて話した場合、 Swiftは、非特異的なタイプの作業に2つの特別なタイプを提供しています。 Anyは、関数タイプを含む、あらゆるタイプのインスタンスを全く表すことができます。 AnyObjectは、任意のクラスタイプのインスタンスを表すことができます。 さらに、 AnyおよびAnyObjectは、それらが提供する動作と機能が明示的に必要な場合にのみ使用します。コードで扱うことが期待されるタイプについては、常に具体的に記述することをお勧めします。 – Ishika