web-dev-qa-db-ja.com

Swiftでカスタムオブジェクトの配列を適切に宣言する方法は?

ここに私のカスタムクラスがあります...その中に何かが欠けているかどうかはわかりません...

import UIKit

class baseMakeUp {
    var Image = UIImage()
    var Brand: String
    var Color: String
    var Rating: Int = 0

    init (Brand: String, Color: String) {
        self.Brand = Brand
        self.Color = Color
    }
}

ここでインスタンス化しようとしています...

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    let cellIdentifier = "cellIdentifier"

    var foundation: [[baseMakeUp]]
    var blush: [[baseMakeUp]]
    var eyes: [[baseMakeUp]]
    var lips: [[baseMakeUp]]
    var nails: [[baseMakeUp]]

    // put some test data in makeup arrays here...
    foundation[0].Brand = "Revlon"     -------------> "Expected declaration" error.
    foundation[0].Color = "Red"
    foundation[0].Rating = 3
    foundation[1].Brand = "MAC"
    foundation[1].Color = "Blue"
    foundation[1].Rating = 4

必要だとは思わなかったので、ViewControllerクラスの残りは含めませんでした。

エラーは、foundation [0] .Brandに値を割り当てようとすると発生します。

事前にあなたの助けを感謝します!

35
jbd36

最初に、2D配列が必要ないことを想定します。もしそうなら、その観点からあなたの質問に答えます。

    var foundation = [baseMakeUp]()

Foundationと呼ばれるbaseMakeUpの空の配列を作成します。添字を使用して配列に要素を追加することはできません。既存の要素を変更するためにのみ使用できます。配列が空なので、要素を追加して追加します。

   foundation.append(baseMakeUp(Brand: "Brand", Color: "Color"))

評価を渡すことができるbaseMakeUp初期化子がないため、要素の評価は0です。ただし、配列に追加したので、次のように評価変数を変更するために添え字を使用できます。

foundation[0].Rating = 3

2D配列を意図していた場合

    var foundation = [[baseMakeUp]]()

配列を作成するには

    foundation.append([])
    foundation[0].append(baseMakeUp(Brand: "Brand", Color: "Color"))
    foundation[0][0].Rating = 3

最初の行は、空の配列を最上位の配列に追加します。 2行目は、1行目に追加された配列にbaseMakeUpを追加します。 3行目は、添え字を使用して、2D配列の最初の配列の最初の要素の評価を変更します。

うまくいけば、それがあなたの問題に役立つでしょう。

追加

ここでjday001sの回答からポイント1と2を追加するつもりでしたが、それらの回答も確認してください。

編集

間違ったスコープで配列に要素を追加しようとしていることに気付きました。

移動する必要があります

foundation.append(baseMakeUp(Brand: "Brand", Color: "Color")

関数内で自分で呼び出すか、viewDidLoadなどの内部に配置します

例えば:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var foundation = [baseMakeUp]()

    override func viewDidLoad() {
        super.viewDidLoad()

        foundation.append(baseMakeUp(Brand: "Brand", Color: "Color")
        foundation[0].Rating = 3
    }
}

うまくいけば、それが役立っています。

44
Nightly

ここでいくつかのことがあります:

  1. いくつかの命名規則がありません。クラス名は大文字にする必要があります(baseMakeUpBaseMakeUpでなければなりません)。
  2. クラス変数は小文字である必要があります(imagebrandcolorrating)。また、initメソッドのbrandcolor
  3. foundation配列を多次元にするつもりですか?通常の配列だけが必要な場合は、次のようなものを使用します。

    var foundation = [BaseMakeup]?
    
  4. 他の答えにあるように、initメソッドを使用してBaseMakeupオブジェクトをインスタンス化する必要もあります。

    let aBaseMakeup = BaseMakeup(brand: "Revlon", color: "Red")
    
  5. その後、次のようにBaseMakeupオブジェクトを配列に追加できます。

    foundation?.append(aBaseMakeup)
    

あなたが達成しようとしていることを理解していることを願っています。

8
jday

最初にカスタムクラスを作成...

import Foundation

class ClassName{

  var id: Int?
  var name: String?
  var category_name: String?
  var price: Double?

   init(json: JSON) {
        self.id = json["id"].int
        self.name = json["name"].string
        self.category_name = json["category_name"].string
        self.price = json["price"].double
}

}

次の行を使用して、ViewControllerでこのクラスを使用できます。

var arrayName:Array<yourclassname> = Array()
print("/(yourclaseename[0].name)")
3
Tina Detroja

クラスオブジェクトをインスタンス化する必要があります

例:

var foundation = baseMakeUp(Brand: "Some Brand", Color: "Red")
0
gnm1978