Tolle Fragen. Lassen Sie uns jeden einzeln aufschlüsseln.
Was ist die richtige Verwendung von URLRequestConvertible in der realen API?
Das URLRequestConvertible
Protokoll ist eine einfache Methode, um sicherzustellen, dass ein bestimmtes Objekt eine gültige erstellen kann NSURLRequest
. Es gibt nicht wirklich strenge Regeln oder Richtlinien, die Sie dazu zwingen, dieses Protokoll auf eine bestimmte Weise zu verwenden. Es ist lediglich ein Komfortprotokoll, mit dem andere Objekte den Status speichern können, der zum ordnungsgemäßen Erstellen des Status erforderlich ist NSURLRequest
. Weitere Informationen zu Alamofire finden Sie hier .
Sollte ich einen Router pro Endpunkt erstellen?
Definitiv nicht. Das würde den gesamten Zweck der Verwendung eines Enum
. Swift Enum-Objekte sind erstaunlich leistungsfähig, sodass Sie eine große Menge gemeinsamer Zustände gemeinsam nutzen und die Teile einschalten können, die sich tatsächlich unterscheiden. Es NSURLRequest
ist wirklich mächtig , mit etwas so Einfachem wie dem Folgenden etwas erstellen zu können !
let URLRequest: NSURLRequest = Router.ReadUser("cnoon")
Ich kann nicht herausfinden, warum enum zum Erstellen von Routern verwendet wird. Warum verwenden wir keine Klasse mit statischen Methoden?
Eine Aufzählung wird verwendet, da dies eine viel präzisere Möglichkeit ist, mehrere verwandte Objekte unter einer gemeinsamen Schnittstelle auszudrücken. Alle Methoden werden von allen Fällen gemeinsam genutzt. Wenn Sie statische Methoden verwenden, müssen Sie für jeden Fall für jede Methode eine statische Methode haben. Oder Sie müssten eine Aufzählung im Obj-C-Stil innerhalb des Objekts verwenden. Hier ist ein kurzes Beispiel dafür, was ich meine.
enum Router: URLRequestConvertible {
static let baseURLString = "http://example.com"
case CreateUser([String: AnyObject])
case ReadUser(String)
case UpdateUser(String, [String: AnyObject])
case DestroyUser(String)
var method: Alamofire.HTTPMethod {
switch self {
case .CreateUser:
return .post
case .ReadUser:
return .get
case .UpdateUser:
return .put
case .DestroyUser:
return .delete
}
}
var path: String {
switch self {
case .CreateUser:
return "/users"
case .ReadUser(let username):
return "/users/\(username)"
case .UpdateUser(let username, _):
return "/users/\(username)"
case .DestroyUser(let username):
return "/users/\(username)"
}
}
}
Um die Methode eines der verschiedenen Endpunkte abzurufen, können Sie dieselbe Methode aufrufen, ohne Parameter übergeben zu müssen, um zu definieren, nach welchem Endpunkttyp Sie suchen. Dies wird bereits von dem von Ihnen ausgewählten Fall behandelt.
let createUserMethod = Router.CreateUser.method
let updateUserMethod = Router.UpdateUser.method
Oder wenn Sie den Pfad erhalten möchten, die gleichen Arten von Anrufen.
let updateUserPath = Router.UpdateUser.path
let destroyUserPath = Router.DestroyUser.path
Versuchen wir nun den gleichen Ansatz mit statischen Methoden.
struct Router: URLRequestConvertible {
static let baseURLString = "http://example.com"
static var method: Method {
}
static func methodForEndpoint(endpoint: String) -> Method {
}
static var path: String {
}
static func pathForEndpoint(endpoint: String) -> String {
}
static var pathForCreateUser: String {
return "/create/user/path"
}
static var pathForUpdateUser: String {
return "/update/user/path"
}
}
HINWEIS: Wenn Sie nicht viele Eigenschaften oder Funktionen haben, die die Fälle aktivieren, bietet eine Aufzählung nicht viele Vorteile gegenüber einer Struktur. Es ist einfach ein alternativer Ansatz mit unterschiedlichem syntaktischem Zucker.
Aufzählungen können die Wiederverwendung von Status und Code maximieren. Mit den zugehörigen Werten können Sie auch einige wirklich leistungsstarke Aufgaben ausführen, z. B. Objekte gruppieren, die etwas ähnlich sind, aber unglaublich unterschiedliche Anforderungen haben ... wie z. B. die NSURLRequest
Erstellung.
Was ist der richtige Weg, um Parameter für Enum-Fälle zu erstellen, um die Lesbarkeit zu verbessern? (musste dieses zusammen pürieren)
Das ist eine tolle Frage. Sie haben bereits zwei mögliche Optionen festgelegt. Lassen Sie mich ein Drittel hinzufügen, das Ihren Bedürfnissen etwas besser entspricht.
case CreateUser(username: String, firstName: String, lastName: String, email: String)
case ReadUser(username: String)
case UpdateUser(username: String, firstName: String, lastName: String, email: String)
case DestroyUser(username: String)
In Fällen, in denen Sie Werte zugeordnet haben, kann es hilfreich sein, explizite Namen für alle Werte im Tupel hinzuzufügen. Dies hilft wirklich dabei, den Kontext aufzubauen. Der Nachteil ist, dass Sie diese Werte dann in Ihren switch-Anweisungen wie folgt neu deklarieren müssen.
static var method: String {
switch self {
case let CreateUser(username: username, firstName: firstName, lastName: lastName, email: email):
return "POST"
default:
return "GET"
}
}
Dies gibt Ihnen zwar einen schönen, konsistenten Kontext, wird aber ziemlich ausführlich. Dies sind derzeit Ihre drei Optionen in Swift. Welche Option die richtige ist, hängt von Ihrem Anwendungsfall ab.
Aktualisieren
Mit der Veröffentlichung von 🔥🔥 Alamofire 4.0 🔥🔥 URLRequestConvertible
kann das jetzt VIEL schlauer sein und auch werfen. Wir haben Alamofire voll unterstützt, um ungültige Anforderungen zu verarbeiten und über die Antworthandler sinnvolle Fehler zu generieren. Dieses neue System ist in unserer README ausführlich dokumentiert .
case
Aussagen. Das sieht für mich nach einer riesigen Methode aus. Ich bin nicht sicher, ob das zu dem lesbaren Code führen wird ...