我应该将我的字符串设置为Nil还是Empty?

时间:2017-07-19 09:28:58

标签: swift swift3 optional

我有一个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)
}

3 个答案:

答案 0 :(得分:1)

通常,如果需要检查变量在代码中的某个点是否具有有效值,最好将变量设置为Optional,而不是将其设置为初始值。这正是Optionals的设计目的,因此您可以在代码中的任何位置检查是否已设置该特定变量,而不给它任何有意义的值。

对于字符串,""也可以轻松工作,因为在大多数情况下,空字符串文字("")不是有意义的值,因此您可以轻松检查它,但它更好练习使用Optionals,因为它们提供了更复杂的方法来检查它们是否已经设置,然后检查字符串是否等于""

答案 1 :(得分:1)

这个问题肯定已被问过很多次了。

好吧,nil""取决于您的属性数据,当对象或值可能存在时使用的nil。当您使用guardif 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会带来更少的维护和更简洁的代码。