[Für Anfänger] Lassen Sie uns wie Swift beschichten!

Swift ist eine der modernen Sprachen. Man kann sagen, dass es eine der neuesten Sprachen ist, da es jedes Jahr aktualisiert wird (obwohl es jedes Mal schwierig ist, damit umzugehen ...).

Dieses Mal werde ich Karten, Filter und forEach vorstellen, die häufig in modernen Sprachen verwendet werden. Ich benutze es oft in anderen Sprachen, daher denke ich, dass es sich lohnt, daran zu denken.

Sobald Sie sich daran gewöhnt haben, werden Sie darüber nachdenken, ob ein Prozess mithilfe der Karte ausgedrückt werden kann.

map

Beispiel

struct User {
    let id: String
    let name: String
}

let users = [
    User(id: "111", name: "aaa"),
    User(id: "112", name: "bbb"),
    User(id: "113", name: "ccc"),
    User(id: "114", name: "ddd"),
    User(id: "115", name: "eee"),
    User(id: "116", name: "fff"),
]

var result = [String]()
for user in users {
    result.append(user.id)
}

print(result)
// ["111", "112", "113", "114", "115", "116"]

Ein Array vom Typ String wird durch Sammeln von Benutzer-IDs erstellt. Ich denke, ich werde lernen, es in Universitätsklassen so zu beschichten.

Aber mit Swift können Sie in kürzerem Code schreiben.

struct User {
    let id: String
    let name: String
}

let users = [
    User(id: "111", name: "aaa"),
    User(id: "112", name: "bbb"),
    User(id: "113", name: "ccc"),
    User(id: "114", name: "ddd"),
    User(id: "115", name: "eee"),
    User(id: "116", name: "fff"),
]

let result = users.map { $0.id }

print(result)
// ["111", "112", "113", "114", "115", "116"]

Sie können mit der Karte in nur einer Zeile schreiben! Wenn Sie sich bei "$ 0" nicht sicher sind, überprüfen Sie dies bitte hier.

let result = users.map { user in
    user.id
}

Ich denke, Sie können es durch diese Beschreibungsmethode verstehen (ähnlich wie für ~ in). Wenn Sie "user in" weglassen, können Sie es als "$ 0" ausdrücken.

Fazit

** map kann für jedes Element etwas verarbeiten und das Ergebnis als Array zurückgeben! ** **.

compactMap

Beispiel

struct User {
    let id: String
    let name: String
}

let users = [
    User(id: "111", name: "aaa"),
    User(id: "112", name: "bbb"),
    User(id: "113", name: "ccc"),
    User(id: "a114", name: "ddd"),
    User(id: "a115", name: "eee"),
    User(id: "a116", name: "fff"),
]

let stringUserIdList = users.map { $0.id }
var result = [Int]()
for stringUserId in stringUserIdList {
    if let id = Int(stringUserId) {
        result.append(id)
    }
}

print(result)
// [111, 112, 113]

Zuvor habe ich mithilfe der Karte ein Array von Zeichenfolgen erstellt. Möglicherweise möchten Sie jedoch die ID in "Int" anstelle von "String" konvertieren, um ein Array zu erstellen. Wenn es so bleibt, wie es ist, wird der Quellcode doch lange dauern.

Verwenden Sie in solchen Fällen compactMap.

let result = users
    .compactMap { Int($0.id) }

print(result)
// [111, 112, 113]

users.map {Int ($ 0.id)} gibt ein Array von Int? zurück. Wenn Sie versuchen, von String nach Int umzuwandeln, können Sie natürlich nicht 100% umwandeln, sodass Int? Zurückgegeben wird.

Aber compactMap entfernt das Null. Daher ist der zurückgegebene Typ ein Array von Int.

Fazit

** compactMap kann jedes Element verarbeiten und das Ergebnis als Array ohne Null zurückgeben! ** **.

flatMap

Beispiel

let users = [
    [
        User(id: "101", name: "man1"),
        User(id: "102", name: "man2"),
        User(id: "103", name: "man3"),
        User(id: "104", name: "man4"),
        User(id: "105", name: "man5")
    ],
    [
        User(id: "201", name: "women1"),
        User(id: "202", name: "women2"),
        User(id: "203", name: "women3"),
        User(id: "204", name: "women4"),
        User(id: "205", name: "women5")
    ]
]
var result = [String]()

//Der Name Geschlecht ist nicht gut...
for gender in users {
    for user in gender {
        result.append(user.id)
    }
}

print(result)
// ["101, "102", "103", "104", "105", "201", "202", "203", "204", "205"]

Nehmen wir auf diese Weise an, dass es eine assoziative Reihenfolge gibt, in der Männer und Frauen getrennt werden. Wenn ich alle IDs von diesen Benutzern extrahiere, denke ich, dass es so implementiert wird.

Natürlich wird die for-Anweisung zweimal wiederholt ... Aber mit flatMap ist es einfach!

let result = users
    .flatMap { $0 }
    .map { $0.id }

print(result)
// ["101, "102", "103", "104", "105", "201", "202", "203", "204", "205"]

flatMap macht es buchstäblich flach.

Fazit

** flatMap glättet tiefe Elemente in der Hierarchie! ** **.

Vorteile von Map, CompactMap, FlatMap

Als Referenz ...

CompactMap war in früheren Swift-Versionen nicht vorhanden. Natürlich hatte "flatMap" auch die Funktion "compactMap", so dass es sehr kompliziert zu sein scheint.

Die neueste Version löst dieses Problem, verwenden Sie es also häufig!

filter

Beispiel

struct User {
    /// ID
    let id: String
    ///Name
    let name: String
    ///Geschlecht 1: männlich, 2: weiblich, 0: andere
    let gender: Int
    ///Höhe
    let height: Float
}

let users = [
    User(id: "001",
         name: "Tanjiro",
         gender: 1,
         height: 165),
    User(id: "102",
         name: "Nezuko",
         gender: 2,
         height: 153.0),
    User(id: "103",
         name: "Wann",
         gender: 1,
         height: 165.5),
    User(id: "104",
          name: "Inosuke",
          gender: 1,
          height: 164.0)
]
//Holen Sie sich nur Männer
var mens = [User]()
//Holen Sie sich nur Benutzer unter 164 cm
var result = [User]()
for user in users {
    if user.gender == 1 {
        mens.append(user)
    }
    if user.height <= 164.0 {
        result.append(user)
    }
}
print(mens)
print(result)

Wie als ich die Karte vorstellte Eine Variable (Array), die das erfasste Ergebnis speichert, wird vorbereitet, und was von der if-Anweisung in der for-Anweisung übergeben wird, wird in der Variablen gespeichert.

Sie können einen kleinen Kühler mit "Filter" schreiben.

//Holen Sie sich nur Männer
let result = users.filter { $0.gender == 1 }
//Holen Sie sich nur Männer unter 164 cm
let result = users
    .filter { $0.gender == 1 }
    .filter { $0.height <= 164.0 }

Lass es uns positiv nutzen! !!

forEach

Der Verwendungszweck ist der gleiche wie "für ~ in". Wenn Sie es abkürzen möchten, verwenden Sie häufig "forEach".


// for~in
for user in users {
    print(user)
}

// forEach
users.forEach { print($0) }

Fazit

** forEach kann mit jedem Element etwas anfangen! ** **.

Recommended Posts

[Für Anfänger] Lassen Sie uns wie Swift beschichten!
[Für Anfänger] Ruby soll Rubin sein, aber was ist damit?
[Tipps] So lösen Sie Probleme mit XCode und Swift für Anfänger
(Für Anfänger) Swift UI View Element Collection
Lernen wir die SQL SELECT-Anweisung für Anfänger
[Ruby] Wie man Slice für Anfänger benutzt
[Für Anfänger] So debuggen Sie mit Eclipse
Schnelle Anfänger versuchten, Mikrowellenlogik zu implementieren!
[Swift / Für Anfänger] Schreiben Sie intelligent mit Typinferenz
Beiträge, die für JNI-Anfänger nützlich sein können
[Für Anfänger] So implementieren Sie die Löschfunktion
Schnelle Anfänger haben versucht, die Automatenlogik zu implementieren!
[Für Super-Anfänger] Verwendung des Autofokus: true
[Einführung in Java] Grundlagen der Java-Arithmetik (für Anfänger)
Verwenden wir Java New FileIO! (Einführung für Anfänger)
[Für Anfänger] Wo kann überprüft werden, wann eine Klasse zur Kompilierungszeit nicht gefunden werden kann?