【问题标题】:Should I set my Strings to Nil or Empty?我应该将字符串设置为 Nil 还是 Empty?
【发布时间】:2017-07-19 09:28:58
【问题描述】:

我有一个Meeting 类,我在其中解析用户的日历以确定该类的属性。这些字段中的大多数是Strings,其中可能没有任何内容。当我发现这些字段为空时,最好将它们设置为空 "" 还是将它们设为可选并将它们设置为 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)
}

【问题讨论】:

    标签: swift swift3 optional


    【解决方案1】:

    Optional 旨在确定是否缺少数据。如果这是您的程序检查的内容,那么您确实应该使用该功能。从长远来看,在您可以利用“可选链接”和“自动展开”的情况下,这是非常值得的:

    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”的第一行是使用“Optional Chaining”。如果 currentDay 或 currentDay.events 为 nil,则不会执行“if”块。如果 currentDay 和 currentDay.events 不是 nil,currentDay.events 将自动解包并分配给“events”,然后代码执行将进入“if”块。接下来,根据当天是否有任何事件(即数组计数),“if let location = event.location”还会检查 location 是否为 nil,如果不是 nil,将自动解包并分配给“位置”,并将打印该值。

    如果这些 Optionals 中的任何一个为 nil,那么您的代码中无需更改任何内容。在这里,我删除了“events”和“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 会减少维护,并且代码通常更简洁。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 奇怪的是,苹果的 EKEvent 类在它为空时并没有将calendarEvent.notes 设置为nil,而是设置为""。我需要将空字符串转换为 nil 值。
      • 或者最好保留它们,并将"" 识别为空字段,将nil 识别为不存在的字段。
      【解决方案3】:

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

      好吧,nil"" 取决于您的属性数据,nil 在对象或值可能存在或不存在时使用。当您使用guardif let 检查它的值时,分配 nil 也非常方便。 nil 提出了可能性的问题。

      您也可以使用""。它也很好用,但有时在比较响应中的默认空值时会变得很头疼。

      【讨论】:

        猜你喜欢
        • 2017-11-05
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 2019-06-11
        • 1970-01-01
        • 2010-11-19
        相关资源
        最近更新 更多