[SWIFT] Operacje na klasach

0

Witam serdecznie,
Ćwiczę sobie programowanie obiektowe we Swifcie.
Mam taki kod:

var array = [KlasyTestowe]()
for index in 1...10 {
    let liczba: UInt32 = arc4random_uniform(100)
    let nazwa: String = "Produkt \(liczba)"
    let ilosc: Int = Int(liczba)
    let uzywany: Bool = true
    let cena: Int = Int(liczba) * index
    
    array.append(KlasyTestowe(name: nazwa, ilosc: ilosc, uzywany: uzywany, cena: cena))
}

for szukane in array {
    print("\(szukane.name) i jego cena \(szukane.cena)")
}

który tworzy obiekty z produktami i następnie je wyświetla.

Kod klasy wygląda następująco:

class KlasyTestowe{
    var name: String
    var ilosc: Int
    var uzywany: Bool
    var cena: Int
    
    init(name: String, ilosc: Int, uzywany: Bool, cena: Int) {
        self.name = name
        self.ilosc = ilosc
        self.uzywany = uzywany
        self.cena = cena
    }
    
    func dodaj_cene(add_cena: Int) -> Int{
        return add_cena + 50
    }
    
}

Proszę się nie sugerować polskimi nazwami zmiennych itp - wiem że powinny być po angielsku i formą zapisu. To są moje "naukowe notatki" ;)

Chciałbym do powyższego kodu:

  1. przy okazji wyświetlania listy produktów ( funkcja for) wykonać funkcję dodaj_cene - dla poszczególnych, wyświetlanych obiektów.
    Czy da się wywołać z tego miejsca funkcję/metodę dla wyświetlanego obiektu? Czy muszę napisać nową funkcję?

  2. Zmienić nazwę produktu (poza pętlą) dla pozycji 2 na "nowa nazwa produktu".
    domyślam się że można zrobić coś w stylu:

array.remove(at: 1) // usunąć element tablicy
.... dodać ponownie ten obiekt, z nową nazwą

tylko to zapewne nie jest optymalny sposób :(

Czy mógłbym prosić o przykład jak zrobić powyższe operacje? :)
Potrzebuję sobie to tak łopatologicznie rozpisać :)

Jeszcze raz bardzo dziękuję za pomoc

0

Ok, w pętli tworzące obiekty przy deklaracjach let nie musisz podawać jej typu - inferencja typów załatwi to za ciebie (co dziwne użyłeś jej przy deklaracji tablicy ;) )

  1. Da się choć metoda dodaj_cene jest myląca. Nazwa metody sugeruje że modyfikuje wewnętrzny stan obiektu (zmienną cena) co tutaj nie zachodzi. Jeśli chcesz zachować obecne działanie to ja bym zrobił ją statyczną + i wywal ten magic number 50 w jakąś stałą.

array[index].name = "nowa nazwa produktu"

Przy czym dla ciebie zostawiam sprawdzenie czy index jest poprawny dla danej tablicy. Powyższy kod zadziała bo masz tablicę z typami przekazywanymi przez referencję (obiektami) a nie przez wartość.


PS: Na koniec: ten kod to jedno wielkie WTF :)
0

@up
"Magic number" czyli na początku deklaracji funkcji dodajesz zmienną typu "wartośćOKtórąPowiększamyCenę", potem ją tylko wołasz. Traktuj kod jako coś co inny człowiek ma przeczytać -> wtedy łatwiej będzie Ci odpowiednio formatować strukturę kodu i odpowiednio wydzielać funkcje z innych funkcji.

Co do OP:
Nie rozumiem pierwszego pytania. Przecież napisałeś funkcję .dodajCenę (która, tak jak napisał przedmówca ma nieporprawną nazwę bo sugeruję modyfikacje obiektu który ją wywołuję; jeśli chciałbyś tak to zrobić, to nazwa powinna być typu "getPriceAfterAddition". W ogóle to po co dodajesz taką funkcję do tego obiektu skoro nie korzysta ona z niego? To powinna być albo funkcja statyczna albo extension (dodawanie rozszerzeń do klas standardowych to bardzo "swiftowy" sposób kodowania, polecam.

Do drugiego pytania: machnij sobie if-let.

I nie pisz kodu po Polsku, nawet jeśli to tylko brudnopis. Programuje się po angielsku i tyle. Nawet myśleć powinieneś po angielsku.

0

Super, bardzo dziękuję za wszystkie wskazówki - na pewno się przydadzą :)
Dodawanie obiektów do tablicy lepiej robić tak:

array.insert(newElement, at: Int)

czy :

array.append(newElement)

? :)

Jeśli dobrze rozumiem, to ten pierwszy sposób wymusza ręczne dodawanie indeksów i muszą być one liczone od 0 do nieskończoności (bez przerw). A ten 2 sposób robi to automatycznie?

Jeśli chodzi o moje 2 pytanie (zmiana nazwy lub usuwanie obiektu z tablicy). Załóżmy że mam koszyk zakupów (obiektów) w aplikacji (np. sklep).
Robię sobie wyświetlanie:

for (index, value) in array.enumerated() {
print("\PRZEDMIOT id: \(value.id) \(value.name) - cena: \(value.cena)")
}

i będę chciał usunąć obiekt o ID = 2 i 4 (lub zmienić nazwę/ilość).
to usuwamy to na podstawie indexu z pętli for - czy np. szukamy określonej zmiennej/wartości w obiekcie (np. id = 2 lub id = 4)?
Jak to się robi profesjonalnie?

0

Chyba dziś nie srałeś. Co to za guwnokod. Wszystko źle masz

0

Dodawanie obiektów: append vs insert Warto zwrócić uwagę na złożoność obliczeniową obu metod.

Usuwanie obiektów: ale chcesz rozwiązania szybkiego czy bezpiecznego? Bo na podstawie indeksu jest szybkie ale niekoniecznie bezpieczne zaś przeszukiwanie po tablicy po określonym ID niekoniecznie szybkie. Czego chcesz? :)

0

Dziękuje za porównanie :) chce profesjonalnego, zgodnego ze sztuka :)

0

Żle stawiasz średniki na mÓj gust

1 użytkowników online, w tym zalogowanych: 0, gości: 1