GOOGLE ADS

Mittwoch, 20. April 2022

Soll ich meine Strings auf Null oder Leer setzen?

Ich habe eine MeetingKlasse, in der ich den Kalender des Benutzers parse, um die Eigenschaften dieser Klasse zu bestimmen. Die meisten dieser Felder sind Strings, die potenziell nichts enthalten können. Wenn ich entdecke, dass diese Felder leer sind, ist es besser, sie auf leer zu setzen ""oder sie optional zu machen und sie auf zu setzen nil?

/**
Parses calendar entry to create a Meeting object.
- parameter calendarEvent: The calendar entry we want to parse
- returns: A Meeting Object with the relevant information extracted from the calendar entry.
*/
public static func parse(calendarEvent: EKEvent) -> Meeting {
let location = calendarEvent.location?? ""
let description = calendarEvent.notes?? ""
let allInput = "\(calendarEvent.title)\n\(location)\n\(description)"
let parsedHostCodes = parseHostCode(from: allInput)
let parsedPasscodes = parseParticipantCode(from: allInput, hostCodes: parsedHostCodes)
let parsedPhoneNumbers = parsePhoneNumber(from: allInput, codes: parsedPasscodes + parsedHostCodes)
return Meeting(
UUID: calendarEvent.eventIdentifier,
title: calendarEvent.title,
description: description,
location: location,
startTime: calendarEvent.startDate,
endTime: calendarEvent.endDate,
allday: calendarEvent.isAllDay,
participantCodes: parsedPasscodes,
hostcodes: parsedHostCodes,
phoneNumbers: parsedPhoneNumbers,
host: retrieveHost(from: calendarEvent.organizer),
attendees: parseParticipants(from: calendarEvent.attendees),
provider: allInput.contains(pattern: attRegex)?.att:.unknown)
}


Lösung des Problems

Optionals dienen dazu, das Fehlen von Daten festzustellen. Wenn Ihr Programm danach sucht, sollten Sie diese Funktion wirklich verwenden. In Situationen, in denen Sie „Optional Chaining" und „Auto-unwrap" nutzen können, lohnt es sich auf Dauer:

struct Event {
let location: String?
}
struct Day {
let events: [Event]?
}
var events: [Event]?
let currentDay: Day?
events = [Event(location: "conf room A1")]
currentDay = Day(events: events)
if let events = currentDay?.events {
for event in events {
if let location = event.location {
print(location)
}
}
}

Hier passiert viel mehr als das, was Sie sehen. Zunächst habe ich alles optional gemacht, da dies in Ihrem Code wahrscheinlich der Fall ist.

Die erste Zeile des "if let" verwendet "Optional Chaining". Wenn entweder currentDay oder currentDay.events null ist, wird der „if"-Block nicht ausgeführt. Wenn currentDay und currentDay.events nicht nil sind, werden currentDay.events automatisch entpackt und „events" zugewiesen, und dann wird die Codeausführung in den „if"-Block verschoben. Als Nächstes, abhängig davon, ob es Ereignisse für diesen Tag gibt (z. B. Array-Anzahl), prüft "if let location = event.location" auch, ob der Ort null ist oder nicht, und wenn er nicht null ist, wird er automatisch entpackt und zugewiesen zu " Ort" und druckt den Wert.

Wenn eines dieser Optionals null ist, muss nichts in Ihrem Code geändert werden. Hier habe ich die Zuweisung von "events" und "currentDay" entfernt, sodass beide null sind:

var events: [Event]?
let currentDay: Day? = nil
if let events = currentDay?.events {
for event in events {
if let location = event.location {
print(location)
}
}
}

Wie Sie sehen können, führt die Nutzung von Optionals langfristig zu weniger Wartung und allgemein saubererem Code.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...