Multi-Target Swift Framework erstellen – Development

Development

Nun da wir unser Projekt eingerichtet haben, ist es Zeit etwas Code zu schreiben.

Unser Ziel ist es, so viel Sourcecode wie möglich zwischen allen drei Framework teilen. Um dies zu tun, speichern wir die geteilten Soucefiles in den Ordner Sources, den wir während dem Setup erstellt hatten. Diese Sourcen werden anschliessend allen drei Framework Targets zugeordnet.

Lass uns eine Beispielklasse erstellen um die km eines Autos zu tracken:

public class Car: CustomStringConvertible {
  var name: String
  var km: Int

  public init(name: String, km: Int) {
    self.name = name
    self.km = km
  }

  public func add(km: Int) {
    self.km += km
  }

  public var description: String {
    return "Car '\(name)' has \(km) km."
  }
}

In unserer Anwendung wollen wir ein Auto wie folgt nutzen:

let car = Car("Toyota Camry", km: 190000)
print(car) //  Car 'Toyota Camry' has 190000 km
car.add(km: 1000)
print(car) //  Car 'Toyota Camry' has 191000 km

Merke: Da die beiden Properties name und km sind non-public. Es wird nicht möglich sein auf diese von unserer Hauptapplikation zuzugreifen;

Sourcedateien hinzufügen

Im Projektnavigator klicke mit der rechten Maustaste und wähle „New Group“ und nenne es „Sources“. Nun selektiere Sources und wähle File -> New -> File… oder drücke ⌘ + N auf der Tastatur. Anschliessend wähle iOS -> Swift File.

Speichere das File als Car.swift im Ordner Sources. Achte darauf, dass die Datei der Sources Gruppe hinzugefügt wird und dass alle Framework Targets selektiert sind.

Kopiere nun den Code von oben und füge ihn in Xcode ein.

Versuche nun jedes Scheme zu erstellen (⌘ + B). Do kannst zwischen den Schemes mit den Shortcuts Ctrl + ⌘ + [ and Ctrl + ⌘ + ] hin und her navigieren.

Über Public und Private

In Swift, das Keyword public zeigt dass der Code von ausserhalb des Moduls erreichbar ist.

Public access enables entities to be used within any source file from their defining module, and also in a source file from another module that imports the defining module. You typically use public access when specifying the public interface to a framework. Access Control in Swift

Der Gebrauch von public im Source Code einer iOS, macOS oder tvOS Application bringt keinen Mehrwert, da alle der Application hinzugefügten Files  innerhalb des Applikationsmoduls sind. Hingegen, damit eine Applikation  auf Source Code innerhalb eines Framework zugreifen kann, ist die Verwendung von public notwendig um die Klassen, Methoden und Properties zugänglich zu machen.

Im Gegensatz zu public, das Verwenden von private macht dein Code schwieriger zu testen. Seit Xcode 7 gibt es das Feature das es erlaubt ein Framework mittels @testable import zu importieren, dadurch wird es möglich non-public Code zu testen. Allerdings nicht private Code. Da Module non-public Code nicht von ausserhalb des Moduls zugänglich machen, ist es nicht nötig private in Framework Code zu verwenden.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: