我有一个Meeting类,在该类中,我分析用户的日历以确定该类的属性。这些字段中的大多数都是Strings,其中可能没有任何内容。当我发现这些字段为空时,最好将它们设置为空,还是将它们设置为可选并将其设置为空?

/**
 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)
        }
    }
}

如您所见,从长远来看,利用选项将导致维护量减少,代码通常更干净。

10-08 07:45