我有一个Meeting
类,我在其中解析用户的日历以确定该类的属性。这些字段中的大多数都是String
,其中可能没有任何内容。当我发现这些字段为空时,最好将它们设置为空""
或将它们设为可选并将它们设置为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)
}
答案 0 :(得分:1)
通常,如果需要检查变量在代码中的某个点是否具有有效值,最好将变量设置为Optional,而不是将其设置为初始值。这正是Optionals的设计目的,因此您可以在代码中的任何位置检查是否已设置该特定变量,而不给它任何有意义的值。
对于字符串,""
也可以轻松工作,因为在大多数情况下,空字符串文字(""
)不是有意义的值,因此您可以轻松检查它,但它更好练习使用Optionals,因为它们提供了更复杂的方法来检查它们是否已经设置,然后检查字符串是否等于""
。
答案 1 :(得分:1)
这个问题肯定已被问过很多次了。
好吧,nil
或""
取决于您的属性数据,当对象或值可能存在时使用的nil
。当您使用guard
和if let
检查其值时,分配nil非常方便。 nil
提出了可能性的问题。
您也可以使用""
。它的工作也很顺利,但有时在比较默认的空值和响应时会变得很头疼。
答案 2 :(得分:1)
选项旨在确定缺少数据。如果这是您的程序检查的内容,那么您真的应该使用该功能。从长远来看,你可以利用"可选链接"和"自动解包":
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)
}
}
}
这里发生的事情比你看到的要多得多。首先,我将所有内容都设为可选,因为您的代码可能就是这种情况。
"的第一行;如果让"正在使用"可选链接"。如果currentDay或currentDay.events为nil,则" if"块不会被执行。如果currentDay和currentDay.events不是nil,则currentDay.events将被自动解包并被分配给" events"然后代码执行将落入"如果"块。接下来,取决于当天是否有任何事件(即数组计数)," if let location = event.location"还检查位置是否为零,如果它不是零,将自动解包并分配到" location"并将打印该值。
如果这些Optionals中的任何一个是零,那么代码中的任何内容都不需要更改。在这里,我删除了"事件"和" currentDay"所以他们都没有:
var events: [Event]?
let currentDay: Day? = nil
if let events = currentDay?.events {
for event in events {
if let location = event.location {
print(location)
}
}
}
正如您所看到的,从长远来看,利用Optionals会带来更少的维护和更简洁的代码。