在Swift中何时使用可选类型背后的原则?

在Swift中何时使用可选类型背后的原则?,swift,oop,optional,Swift,Oop,Optional,在Swift中设计类/结构时,确定何时应使用可选类型的最佳实践是什么 例如,假设我将一个JSON响应映射到一个Photo对象,并且有一个属性photopername,它只是一个字符串。有时,我们通过响应接收字段photophername的空字符串 我的Photo对象是否应该使用字符串?键入并将其分配给nil?或者使用字符串类型并将其设置为空字符串?您可以选择使用什么,但是如果您收到的响应的属性可以是nil,那么您应该使用可选并在代码中处理它 大概是这样的: struct Photo {

在Swift中设计类/结构时,确定何时应使用可选类型的最佳实践是什么

例如,假设我将一个JSON响应映射到一个
Photo
对象,并且有一个属性
photopername
,它只是一个字符串。有时,我们通过响应接收字段
photophername
的空字符串


我的
Photo
对象是否应该使用
字符串?
键入并将其分配给nil?或者使用
字符串
类型并将其设置为空字符串?

您可以选择使用什么,但是如果您收到的响应的属性可以是
nil
,那么您应该使用
可选
并在代码中处理它

大概是这样的:

struct Photo {
    let photographerName: String?

    init(photographerName: String? = nil) {
        self.photographerName = photographerName
    }
}
然后在代码中检查
photopername
是否有值:

if let photographerName = photo.photographerName {
    // use photographerName in here
}

您喜欢使用什么取决于您自己,但是如果您收到的响应的属性可以是
nil
,那么您应该使用
optional
,并在代码中处理它

大概是这样的:

struct Photo {
    let photographerName: String?

    init(photographerName: String? = nil) {
        self.photographerName = photographerName
    }
}
然后在代码中检查
photopername
是否有值:

if let photographerName = photo.photographerName {
    // use photographerName in here
}

这实际上取决于您将在应用程序中使用的应用程序体系结构和数据结构

没有规则描述如何在应用程序体系结构中正确使用可选链接

首先,我们应该知道是什么

可选链接是查询和调用属性的过程, 方法和当前可能为nil的可选上的下标。如果 可选的包含值、属性、方法或下标调用 成功;如果可选项为nil,则属性、方法或下标 call返回nil。可以将多个查询链接在一起,并且 如果链中的任何链接为零,则整个链将正常失败

根据我的经验,我在数据结构中使用可选值,但我显然无法定义我的模型是否具有某种关系或属性

例如:

struct User {
    let name: String
    let email: String
    var friends: [String]?

    init(name: String, email: String) {
        self.name = name
        self.email = email
    }
}

let user = User(name: "Oleg", email: "Oleg@email.com")
我知道该用户将有名字和电子邮件,但我不知道他是否会有任何朋友。此外,通过这种方式,我可以防止代码在
nil
对象上执行操作


在您描述的情况下,它实际上取决于应用程序的体系结构和需求。例如,如果
photopername
为空,我们是否应该显示占位符?是否有任何其他操作正在使用
photophername
属性?

这实际上取决于应用程序中要使用的应用程序体系结构和数据结构

没有规则描述如何在应用程序体系结构中正确使用可选链接

首先,我们应该知道是什么

可选链接是查询和调用属性的过程, 方法和当前可能为nil的可选上的下标。如果 可选的包含值、属性、方法或下标调用 成功;如果可选项为nil,则属性、方法或下标 call返回nil。可以将多个查询链接在一起,并且 如果链中的任何链接为零,则整个链将正常失败

根据我的经验,我在数据结构中使用可选值,但我显然无法定义我的模型是否具有某种关系或属性

例如:

struct User {
    let name: String
    let email: String
    var friends: [String]?

    init(name: String, email: String) {
        self.name = name
        self.email = email
    }
}

let user = User(name: "Oleg", email: "Oleg@email.com")
我知道该用户将有名字和电子邮件,但我不知道他是否会有任何朋友。此外,通过这种方式,我可以防止代码在
nil
对象上执行操作


在您描述的情况下,它实际上取决于应用程序的体系结构和需求。例如,如果
photopername
为空,我们是否应该显示占位符?是否有任何正在使用
photopername
属性的附加操作?

如果将nil用作默认值
init(photopername:String?=nil)
如果将nil用作默认值
init(photopername:String?=nil),则只需要一个init