10 najpopularniejszych pytań o Swift

1. Jaka jest różnica między strukturą a klasą?

Struktury (struct) są typami wartości (value types), natomiast klasy są typami referencyjnymi (reference types). Oznacza to tyle, że jeżeli wskażesz dwie zmienne w tej samej strukturze, każda z nich będzie miała własną, niezależną kopię danych. Wskazanie dwóch zmiennych w tej samej instancji klasy spowoduje, że obie będą odnosić się do tego samego obiektu.

Przykład typu referencyjnego:

class SomeClass {
    var classId: Int

    init(id: Int) {
        self.classId = id
    }
}

var classA = SomeClass (id: 10)
var classB = classA // 'classB' references the same object as 'classA'

print(classA.classId)
// prints out '10'
print(classB.classId)
prints out '10'

classA.classId = 20

print(classA.classId)
// prints out '20'
print(classB.classId)
// prints out '20

Przykład typu wartości:

struct SomeStruct {
    var structId: Int
}

var structA = SomeStruct(structId: 10)
var structB = structA // 'structB' gets a new copy of StructA

print(structA.structId)
// prints out '10'
print(structB.structId)
// prints out '10'

structA.structId = 20

print(structA.structId)
// prints out '20'
print(structB.structId)
// prints out '10'

2. Czy Swift posiada managera pakietów podobnego do npm(js), pip(py), pub(dart)?

Tak, w rzeczywistości istnieje kilka sposobów włączenia kodu innej firmy do swojego projektu:

Integracja manualna

Zasadniczo, ten ręczny proces, polega na przeciągnięciu pakietu do projektu i połączeniu ich ze sobą. Jest to całkiem proste z kilkoma bibliotekami zewnętrznymi, ale przy większej ich liczbie, utrzymanie staje się bardziej skomplikowane i podatne na błędy.

Manager pakietów Swift

Zintegrowany w Swift 3.0 i wyżej, zarządzany przez Apple, ten manager jest najbardziej podobny do NPM spośród wymienionych. Ponieważ wciąć uważany jest za “nową rzecz” w rozwoju iOS, wiele bibliotek nie obsługuje tego kanału dystrybucji.

Więcej informacji na ten temat: https://swift.org/getting-started/#using-the-package-manager

Carthage

Carthage wymaga wstępnej, ręcznej konfiguracji i zwykle działa powoli podczas pierwszej kompilacji. Z czasem pokazuje swoją moc, ponieważ kolejne kompilacje są niezwykle szybkie. Jednakże, część bibliotek nie jest rozpowszechniona w Carthage (oficjalnie).

Więcej informacji: https://github.com/Carthage/Carthage

CocoaPods

CocoaPods jest prawdopodobnie najpopularniejszym managerem zależności dla systemu iOS. Jest bardzo łatwy w konfiguracji i obsłudze. Czasami znacznie wydłuża czas kompilacji Twojego projektu (np. z Realm). Jednak wiele bibliotek jest dystrybuowanych za pomocą CocoaPods.

Więcej informacji: https://cocoapods.org/

3. Jak przekształcić “double” w “string”?

Możesz osiągnąć to kilkoma różnymi sposobami. Przedstawiamy je poniżej:

import Foundation

let doubleValue = 3.14
print(type (of: doubleValue))
// prints out 'Double'

let stringFromDouble = doubleValue.description
print(type(of: stringFromDouble))
// prints out 'String'

let anotherStringFromDouble = "\(doubleValue)"
print(type(of: anotherStringFromDouble))
// prints out 'String'

let yetAnotherStringFromDouble = "\(doubleValue)"
print(type(of: yetAnotherStringFromDouble))
// prints out 'String'

4. Czym jest wartość opcjonalna (optional value)?

Zmienna opcjonalna (optional variable) może mieć jeden z dwóch stanów: albo zawiera wartość, albo jest “zero” (bez podanej wartości). W Swift’cie zazwyczaj deklarujesz typy opcjonalne ze znakiem zapytania (np. Int?, String?, Double?). Aby użyć wartości przechowywanej w zmiennej opcjonalnej, musisz ją rozpakować wykorzystując: wiązanie opcjonalne (optional binding), łączenia opcjonalnego (optional chaining), wymusić rozpakowanie lub zerową koalescencję operatora (nil-coalescing operator).

Więcej informacji: https://developer.apple.com/documentation/swift/optional

5. Co oznacza “błąd krytyczny: nieoczekiwanie znaleziono zero podczas rozpakowywania wartości opcjonalnej” (fatal error: unexpectedly found nil while unwrapping an Optional value)?

Ten błąd środowiska wykonawczego zwykle wywoływany jest a każdym razem, gdy uzyskujesz dostęp do wartości opcjonalnej “zero” w bezpieczny sposób (używając wymuszania rozpakowywania lub domyślnie nierozpakowanych opcji).

Więcej informacji: https://stackoverflow.com/a/32170457/11857047

6. Jak przesyłać dane między kontrolerami widoku?

Istnieje wiele sposobów osiągnięcia tego celu. Np. sekwencje (segues), właściwości (properties), funkcje (functions), delegates, zamknięcia (closures), Centrum Powiadomień (Notifications Center). Niektóre z nich używane są częściej, inne rzadziej. Warto dowiedzieć się jak działa każdy z nich i gdzie zastosować odpowiedni wzór. Więcej informacji na ten temat można znaleźć tutaj:  https://matteomanferdini.com/how-ios-view-controllers-communicate-with-each-other/

7. Jak dodawać ograniczenia?

Możesz użyć jednego z zalecanych przez Apple sposobów: NSLayoutConstraint, NSLayoutAnchor lub Visual Format Language. Więcej informacji: https://stackoverflow.com/a/26181982/11857047. Możesz też użyć biblioteki innej firmy, takiej jak SnapKit, która jest językiem specyficznym dla domeny (DSL), aby uczynić AutoLayout prostym i wyrazistym. Więcej informacji: https://snapkit.io

8. Czym jest “lazy var”?

“Lazy stored property” jest właściwością, której początkowa wartość jest obliczana przy pierwszym użyciu. Jest to bardzo przydatne, gdy chcesz wykonać obliczenia wymagające dużej wydajności w określonych warunkach (np. wywołane przez określone zdarzenie).

Więcej informacji: https://docs.swift.org/swift-book/LanguageGuide/Properties.html

9. Czym jest “empty string” w Swift?

Zgodnie z dokumentacją, właściwość “isEmpty” uważa się za pustą, jeżeli nie ma znaków. Więcej informacji:  https://developer.apple.com/documentation/swift/string/2946268-isempty

10. Jakie są funkcje wyższego rzędu (higher-order functions)?

Funkcje te umożliwiają wykonywanie operacji na sekwencji w bardzo elegancki sposób, np.

map (_ :) 

map (_ 🙂 iteruje każdy element sekwencji, przekształca go na podstawie zamknięcia przekazanego do funkcji i zwraca nową sekwencję z transformowanymi elementami.

reduce(_:_:)

reduce(_:_:) zwraca wynik połączenia elementów sekwencji przy użyciu danego zamknięcia.

filter(_:)

filter(_:) zwraca nową sekwencję z elementami spełniającymi kryteria zdefiniowane w zamknięciu przekazanym do metody.

Więcej informacji: https://medium.com/@Dougly/higher-order-functions-in-swift-sorted-map-filter-reduce-dff60b5b6adf

Rate this post