[SWIFT] Operacje na klasach

[SWIFT] Operacje na klasach
NO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 654
0

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

Kopiuj
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:

Kopiuj
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:

Kopiuj
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

LS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 990
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łą.
  2. Kopiuj

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

Kopiuj
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 :)
HE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 269
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.

NO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 654
0

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

Kopiuj
array.insert(newElement, at: Int)

czy :

Kopiuj
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:

Kopiuj
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?

  • Rejestracja: dni
  • Ostatnio: dni
0

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

LS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 990
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? :)

NO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 654
0

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

  • Rejestracja: dni
  • Ostatnio: dni
0

Żle stawiasz średniki na mÓj gust

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.