10 najpopularniejszych pytań o Swift
Paweł
Swift, którego twórcą jest Apple pojawił się 2 czerwca 2014 roku. Powstał jako następca Objective-C. Język ten w odróżnieniu do poprzednika charakteryzuje się wieloma ułatwieniami, dzięki czemu próg wejścia dla nowych programistów jest znacznie niższy. Dziś prezentujemy 10 najczęściej zadawanych pytań o Swift.
Spis treści
- Jaka jest różnica między strukturą a klasą?
- Czy Swift posiada managera pakietów podobnego do npm(js), pip(py), pub(dart)?
– Integracja manualna
– Manager pakietów Swift
– Carthage
– CocoaPods - Jak przekształcić “double” w “string”?
- Czym jest wartość opcjonalna (optional value)?
- Co oznacza “błąd krytyczny: nieoczekiwanie znaleziono zero podczas rozpakowywania wartości opcjonalnej” (fatal error: unexpectedly found nil while unwrapping an Optional value)?
- Jak przesyłać dane między kontrolerami widoku?
- Jak dodawać ograniczenia?
- Czym jest “lazy var”?
- Czym jest “empty string” w 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