Celem zadania jest stworzenie trzech klas wykonujących proste funkcje. Dzięki temu zadaniu poznasz lepiej składnię Swifta, oraz nauczysz się tworzyć proste klasy typu Util. Nauczysz się też podstaw obsługi XCode, oraz procesu uruchamiania testów jednostkowych.
Pierwszą klasą jest klasa MathTool
. Klasa ta posiada jedną metodę, której zadaniem jest policzenie wartości ciągu Fibonacciego dla podanego argumentu. Przykładowe wywołania dla tego klasy mają wyglądać w ten sposób:
let math = MathTools()
print(math.fibonacci(10))
// prints: 55
Drugą klasą jest klasa StringTools
. W tej klasie stworzymy jedną funkcję, która liczy ilość wystąpień podanego znaku w przekazanym String
u. Przykładowe użycie mamy poniżej:
let stringTools = StringTools()
let count = stringTools.countOccurences(character: "i", from: "Hello. My name is Michał.")
print(count)
// prints: 2
Klasa StringTools
obsługuje dwie wersje podanej funkcji. Może zliczać wystąpienia zarówno z uwzględnieniem wielkości znaków, jak i w trybie case-insensitive. Parametr caseSensitive
jest ostatnim parametrem funkcji, który domyślnie ma wartość true
. Poniżej przykładowe wywołanie z użyciem parametru.
print(StringTools().countOccurences(character: "h", from: "Hello. My name is Michał.", caseSensitive: true))
// prints: 1
print(StringTools().countOccurences(character: "h", from: "Hello. My name is Michał.", caseSensitive: false))
// prints: 2
Kolejne zadanie polega na stworzeniu klasy sprawdzającej czy podana liczba jest liczbą pierwszą, czy złożoną. Do tego celu wykorzystamy swiftowe enum
y. Chcemy żeby wywołanie naszej klasy wyglądało w ten sposób:
let result = Factorization.factorize(5)
print(result == .prime)
// prints: true
Jak widać w powyższego print
u – metoda factorize
zwraca Optional<Result>
, czyli Result?
. Dlaczego wykorzystaliśmy typ Optional
? Niektóre liczby całkowite nie kwalifikują się ani jako pierwsze, ani jako złożone. Wtedy chcemy, żeby funkcja zwróciła nil
.
W przypadku liczby złożonej funkcja factorize
zwraca inną opcję z enuma Result
. Ta opcja zawiera associated value będące tablicą dzielników (ułożone niemalejąco czynniki pierwsze z rozkładu parametru).
Factorization.factorize(1) == nil
Factorization.factorize(5) == .prime
Factorization.factorize(6) == .composite(factors: [2, 3])
Factorization.factorize(8) == .composite(factors: [2, 2, 2])
Factorization.factorize(2 * 2 * 5 * 11 * 13) == .composite(factors: [2, 2, 5, 11, 13])
func testFactorsOf1() {
XCTAssertNil(Factorization.factorize(1))
}
func testFactorsOf2() {
XCTAssertEqual(Factorization.factorize(2), .prime)
}
func testFactorsOf4() {
XCTAssertEqual(Factorization.factorize(4), .composite(factors: [2, 2]))
}
- Po pierwsze stwórz pusty projekt w XCode. Wybierz template iOS -> Framework. Nazwij projekt HelloSwift. Zanzacz, że chcesz stworzyć testy jednostkowe.
- Stwórz trzy pliki pod odpowiednie klasy (
StringTools.swift
,MathTools.swift
orazFactorization.swift
). - Napisz nagłówki funkcji. Przeczytaj odpowiednie informacje o domyślnych parametrach funkcji.
- Target który wybrałeś to biblioteka. Dlatego nie możesz jej uruchomić – możesz jedynie uruchomić testy jednostkowe. Zrób to przy pomocy skrótu klawiaturowego ⌘+U.
- Testy jednostkowe, które stworzyłem do zadania pobierz i umieść w projekcie tak, aby móc sprawdzać czy Twoje zadanie się uruchamia i spełnia założenia.
- Do zadania 3 nie dołączam testów jednostkowych. Napisałem przykładowe wywołania tych funkcji – wykorzystaj je. Możesz napisać własne testy, ale musisz sobie sam(a) poradzić z ich uruchomieniem.
- W trzecim zadaniu jako rezultatu użyj odpowiedniego enum.
- Pamiętaj, żeby opcji
Result.composite
dać associated value –factors: [Int]
. - Typ
Result
umieść jako wewnętrzny typ klasyFactorization
– taki jest pattern w Swifcie, zamiast tworzyć wiszący enumFactoriationResult
. - Podpowiedź: aby móc porównywać do siebie struktury, musisz oznaczyć conformance do protokołu
Equatable
. - Napisz poprawne nagłówek funkcji
factorize
. Użyj funkcji statycznej (obiektFactorization
nie ma stanu wewnętrznego). - Pamiętaj żeby odpowiednio skonfigurować git'a.
- Poprawnie stworzony projekt typu Framework.
- Przechodzące wszystkie testy.
- Styl kodu.
- Umieszczenie klas w osobnych, poprawnie nazwanych plikach.
- Poprawnie stworzone repozytorium w projekcie, poprawnie stworzony commit kodu, sensowna historia commitów.
Odpowiedzi będą automatycznie przyjmowane do końca soboty 16.11.2019, 23:59. Pamiętaj o pushowaniu swoich commitów!