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
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.
compactMap
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.
flatMap
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.
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
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) }
Recommended Posts