我有一个Meeting
类,在该类中,我分析用户的日历以确定该类的属性。这些字段中的大多数都是String
s,其中可能没有任何内容。当我发现这些字段为空时,最好将它们设置为空,还是将它们设置为可选并将其设置为空?
/**
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)
}
最佳答案
选项旨在确定数据的缺失。如果这就是程序检查的内容,那么您真的应该使用这个特性。从长远来看,它是值得的,在这种情况下,你可以利用“可选链接”和“自动解封”的优势:
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)
}
}
}
这里发生的事情比你看到的要多得多。首先,我将所有内容都设置为可选的,因为在您的代码中很可能是这样。
“if let”的第一行使用“可选链接”。如果currentDay或currentDay.events为零,则不会执行“if”块。如果currentDay和currentDay.events不是nil,currentDay.events将自动展开并分配给“events”,然后代码执行将下降到“if”块中。接下来,“如果让location=event.location”还会检查location是否为nil,如果不是nil,则会自动展开并分配给“location”,并打印该值,具体取决于当天是否有任何事件(即数组计数)。
如果这些选项中的任何一个为零,那么代码中的任何内容都不需要更改。在这里,我删除了“事件”和“当前日期”的赋值,使它们都为零:
var events: [Event]?
let currentDay: Day? = nil
if let events = currentDay?.events {
for event in events {
if let location = event.location {
print(location)
}
}
}
如您所见,从长远来看,利用选项将导致维护量减少,代码通常更干净。