Превращение класса объектов Java в класс Swift - PullRequest
0 голосов
/ 13 апреля 2020

Итак, я учусь превращать мои Android приложения в iOS приложения. Я получил довольно далеко, хотя у меня возникла проблема, когда дело доходит до создания объекта. В моем приложении android я читаю в CSV-файле и создаю объект FireworkList, который содержит информацию. Вот код из моего Android приложения:

import java.util.ArrayList;

public class FireworksList{



private ArrayList<Integer> _category = new ArrayList<>();
private ArrayList<String> _name = new ArrayList<>();
private ArrayList<String> _shotCount = new ArrayList<>();
private ArrayList<String> _price = new ArrayList<>();
private ArrayList<String> _description = new ArrayList<>();
private ArrayList<String> _videoUrl = new ArrayList<>();
private ArrayList<Integer> _imageResourceNumber = new ArrayList<>();
private ArrayList<Boolean> _favorite = new ArrayList<>();
private ArrayList<Boolean> _special = new ArrayList<>();
private Integer _specialCategoryNumer =15;
private Integer _nextId;




public FireworksList() {
    _nextId=0;
}




public ArrayList<Integer> get_category() {
    return _category;
}

public ArrayList<String> get_name() {
    return _name;
}

public ArrayList<String> get_shotCount() {
    return _shotCount;
}

public ArrayList<String> get_price() {
    return _price;
}

public ArrayList<String> get_description() {
    return _description;
}

public ArrayList<String> get_videoUrl() {
    return _videoUrl;
}

public ArrayList<Integer> get_imageResourceNumber() {
    return _imageResourceNumber;
}

public ArrayList<Boolean> get_favorite() {
    return _favorite;
}

public void set_favorite(int index, Boolean bool) {
    _favorite.set(index,bool);
}

public ArrayList<Boolean> get_special(){return _special;}









public void Add(int cat, String name, String shot, String price, String description, String video, int image, Boolean fav, Boolean special){
    _category.add(_nextId,cat);
    _name.add(_nextId,name);
    _shotCount.add(_nextId,shot);
    _price.add(_nextId,price);
    _description.add(_nextId,description);
    _videoUrl.add(_nextId,video);
    _imageResourceNumber.add(_nextId,image);
    _favorite.add(_nextId,fav);
    _special.add(_nextId,special);
    _nextId++;

}


public int Count(){
    return _nextId;
}

public FireworksList CategorySort(int position){
    FireworksList fireworksListTemp = new FireworksList();

    for(int i=0; i<_nextId;i++){
        if(position==0){
            fireworksListTemp.Add(_category.get(i),_name.get(i),_shotCount.get(i),_price.get(i),_description.get(i),_videoUrl.get(i),_imageResourceNumber.get(i),_favorite.get(i),_special.get(i));
        }

        else if(position==_category.get(i)){
            fireworksListTemp.Add(_category.get(i),_name.get(i),_shotCount.get(i),_price.get(i),_description.get(i),_videoUrl.get(i),_imageResourceNumber.get(i),_favorite.get(i),_special.get(i));

        }
        else if(position==_specialCategoryNumer&&_special.get(i)==true){
            fireworksListTemp.Add(_category.get(i),_name.get(i),_shotCount.get(i),_price.get(i),_description.get(i),_videoUrl.get(i),_imageResourceNumber.get(i),_favorite.get(i),_special.get(i));
        }
    }

    return fireworksListTemp;
}


public FireworksList FavoriteSort(){
    FireworksList fireworksListTemp = new FireworksList();
    for(int i = 0; i<_nextId;i++){
        if(_favorite.get(i)==true){
            fireworksListTemp.Add(_category.get(i),_name.get(i),_shotCount.get(i),_price.get(i),_description.get(i),_videoUrl.get(i),_imageResourceNumber.get(i),_favorite.get(i),_special.get(i));
        }
    }
    return  fireworksListTemp;
}

public int FindIndex(String name, FireworksList fireworksList){
    int found=0;
    for(int j=0;j<fireworksList.Count();j++){
        if(fireworksList.get_name().get(j).equals(name)){
            found=j;
        }
    }
    return found;
}



}

Я начал переписывать свой код, но столкнулся с проблемой, когда возникла необходимость создать новый список Firework, а затем добавить к нему то, что нужно в функции сортировки категории. Вот мой модифицированный код:

class FireworkList {



var _category = [Int]()
var _name = [String]()
var _shotCount = [String]()
var _price = [String]()
var _description = [String]()
var _videioUrl = [String]()
var _imageResourceNumber = [Int]()
var _favorite = [Bool]()
var _special = [Bool]()
private var _specialCategoryNumber : Int = 15
private var _nextId : Int = 0


func FireworksList(){_nextId = 0}
func get_category() -> Array<Int>{return _category}
func get_name() -> Array<String>{return _name}
func get_shotCount() -> Array<String>{return _shotCount}
func get_price() -> Array<String>{return _price}
func get_discription() -> Array<String>{return _description}
func get_videoUrl() -> Array<String>{return _videioUrl}
func get_imageResourceNumber() -> Array<Int>{return _imageResourceNumber}
func get_favorite() -> Array<Bool>{return _favorite}
func get_special() -> Array<Bool>{return _special}
func set_favorite(index : Int, bool : Bool){_favorite[index] = bool}



func add(cat : Int, name : String, shot : String, price : String, description : String, video : String, image : Int, fav : Bool, special : Bool){
    _category.insert(cat, at: _nextId)
    _name.insert(name, at: _nextId)
    _shotCount.insert(shot, at: _nextId)
    _price.insert(price, at: _nextId)
    _description.insert(description, at: _nextId)
    _videioUrl.insert(video, at: _nextId)
    _favorite.insert(fav, at: _nextId)
    _special.insert(special, at: _nextId)
    _nextId+=1
}


func Count()->Int{return _nextId}



func CategorySort(position : Int)-> [FireworkList]{
   var fireworkListTemp = [FireworkList]()

    for i in 0..._nextId{
        if(position == 0){
            fireworkListTemp.append(FireworkList())
        }
    }

    return fireworkListTemp
}
}

Я благодарен за любую помощь.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Основная проблема в том, что ваш класс java плохо спроектирован, и вы берете этот дизайн с собой, когда пишете его быстро. Вместо того, чтобы иметь набор свойств, которые являются коллекциями, вы должны создать структуру для этих свойств и иметь один массив со структурой. (Я не включил все свойства, чтобы сделать код короче).

struct Firework {
    var category: Int
    var name: String
    var shotCount: String
    var price: String
    var special: Bool
} 

и затем объявить его в основном классе

class FireworkList {
    private var fireworks = [Firework]()

Ниже приведен класс с add , count и categorySort показывают некоторые примеры использования этой структуры. Как видите, это означает, что кода гораздо меньше. Я также позволил себе переименовать свойства и функции, следуя рекомендуемым методам быстрого присвоения имен.

Для categorySort я использовал функцию высокого порядка filter для сбора правильных предметов. Если вы собираетесь работать со swift, я бы порекомендовал вам больше узнать об этом и о других функциях высокого порядка, таких как sort, map et c.

Также стоит упомянуть кого-то из java в том, что мы не используем методы get / set в одинаковой степени в swift. Мы чаще всего получаем доступ к недвижимости напрямую, например let x = myObject.someValue или myObject.someValue = 10

class FireworkList {
    var fireworks = [Firework]()

    private let specialCategoryNumber = 15

    func add(cat : Int, name : String, shot : String, price : String, special: Bool) {
        self.fireworks.append(Firework(category: cat, name: name, shotCount: shot, price: price, special: special))
    }

    func count() -> Int { return fireworks.count }

    func categorySort(position : Int) -> [Firework] {            
        switch position {
        case 0:
            return self.fireworks
        case specialCategoryNumber:
            return self.fireworks.filter { $0.category == specialCategoryNumber && $0.special}
        default:
            return self.fireworks.filter {$0.category == position}
        }
    }
}
1 голос
/ 13 апреля 2020

Вот как я бы это сделал:

public class FireworksList {
    private var _category = [Int]()
    private var _name = [String]()
    private var _shotCount = [String]()
    private var _price = [String]()
    private var _description = [String]()
    private var _videoURL = [String]()
    private var _imageResourceNumber = [Int]()
    public var favorite = [Bool]()
    private var _special = [Bool]()

    private let specialCategoryNumber = 15
    private var nextId = 0

    public var category: [Int] {
        get {
            return _category
        }
    }

    public var name: [String] {
        get {
            return _name
        }
    }

    public var shotCount: [String] {
        get {
            return _shotCount
        }
    }

    public var price: [String] {
        get {
            return _price
        }
    }

    public var description: [String] {
        get {
            return _description
        }
    }

    public var videoURL: [String] {
        get {
            return _videoURL
        }
    }

    public var imageResourceNumber: [Int] {
        get {
            return _imageResourceNumber
        }
    }

    public var special: [Bool] {
        get {
            return _special
        }
    }

    public var count: Int {
        get {
            return nextId
        }
    }


    public func add( cat: Int, name: String, shot: String, price: String, description: String, video: String, image: Int, fav: Bool, special: Bool) {
        self._category.append(cat)
        self._name.append(name)
        self._shotCount.append(shot)
        self._price.append(price)
        self._description.append(description)
        self._videoURL.append(video)
        self._imageResourceNumber.append(image)
        self.favorite.append(fav)
        self._special.append(special)
        nextId += 1
    }

    public func categorySort(at position: Int) -> FireworksList {
        let tmp = FireworksList()

        for i in 0...nextId {
            if position == 0 || position == category[i] ||
                (position == specialCategoryNumber && special[i] == true) {
                tmp.add(cat: category[i], name: name[i], shot: shotCount[i], price: price[i], description: description[i], video: videoURL[i], image: imageResourceNumber[i], fav: favorite[i], special: special[i])
            }
        }

        return tmp
    }
    public func favouriteSort() -> FireworksList {
        let tmp = FireworksList()
        for i in 0...nextId {
            if favorite[i] {
                tmp.add(cat: category[i], name: name[i], shot: shotCount[i], price: price[i], description: description[i], video: videoURL[i], image: imageResourceNumber[i], fav: favorite[i], special: special[i])
            }
        }

        return tmp
    }

    // I'm putting this function as static as it isn't directly related to any particular instance of FireworksList at any point of time.
    public static func findIndex(name: String, fireworksList: FireworksList) -> Int {
        var found = 0

        for j in 0...fireworksList.count {
            if fireworksList.name[j] == name {
                found = j
            }
        }

        return found
    }



}

Мой код просто почти полностью следует вашему Java коду.

Я впервые пытаюсь внести свой вклад в переполнение стека, и Я надеюсь, что это может быть полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...