Swift 为什么隐式展开的optionals复制为可选?

Swift 为什么隐式展开的optionals复制为可选?,swift,optional,Swift,Optional,在下面的代码中,为什么test.implicitString是可选的,即使属性存储为隐式展开的?我相信我需要隐式地展开属性,因为我的初始值设定项调用函数来初始化所有值(因此我可以稍后在update方法中使用相同的函数)。是否有一种简单的方法可以使这些属性成为非可选的,同时仍然允许我通过init()中的方法调用初始化属性 类测试{ var implicitString:字符串! 初始化(字符串:字符串){ 隐式字符串=字符串 } } let test=test(字符串:“Hello world”)

在下面的代码中,为什么
test.implicitString
是可选的,即使属性存储为隐式展开的?我相信我需要隐式地展开属性,因为我的初始值设定项调用函数来初始化所有值(因此我可以稍后在
update
方法中使用相同的函数)。是否有一种简单的方法可以使这些属性成为非可选的,同时仍然允许我通过init()中的方法调用初始化属性

类测试{
var implicitString:字符串!
初始化(字符串:字符串){
隐式字符串=字符串
}
}
let test=test(字符串:“Hello world”)
让shouldBeString=test.implicitString
//1:打印可选而不是字符串
打印(类型(类型:shouldBeString))
//2:打印可选(“Hello world”)而不是“Hello world”
打印(字符串(描述:test.implicitString))

您可以通过设置默认值来摆脱可选选项:

class Test {

    var implicitString: String = ""

    init(string: String) {
        update(value: string)
    }

    func update(value: String) {
        implicitString = value
    }

}

您可以通过设置默认值来摆脱可选选项:

class Test {

    var implicitString: String = ""

    init(string: String) {
        update(value: string)
    }

    func update(value: String) {
        implicitString = value
    }

}

因为您有一个初始化属性的init方法,所以只需删除隐式展开即可

class Test {
  var implicitString: String
  init(string: String) {
    implicitString = string
  }
}

因为您有一个初始化属性的init方法,所以只需删除隐式展开即可

class Test {
  var implicitString: String
  init(string: String) {
    implicitString = string
  }
}

这是正确的答案。(投票)只要init方法给它一个值,它根本不需要是可选的。
不是“强制展开”。它使变量“隐式展开”。是的,你是对的,我的措辞很糟糕。我将修复它,因为我需要通过方法调用来设置属性,所以它不起作用。我希望能够有一个
更新(来自数据:[String:Any])
函数,该函数重用初始化代码来设置所有实例变量。在init和update方法中复制完全相同的代码似乎很愚蠢,但是如果不隐式地打开所有变量,我就无法集中这些代码。这就是问题所在。如何在init中调用函数,而不让所有属性在使用时都是可选的。默认值似乎很愚蠢,因为它们永远不会被使用,但也许这就是答案。听起来你需要有默认值,但整个解决方案有点奇怪。首先,您将在init方法中将所有属性设置为特定值,然后,您将修改对象的所有参数,如果您完全更改对象,那么最好创建一个新实例。这是正确的答案。(投票)只要init方法给它一个值,它根本不需要是可选的。
不是“强制展开”。它使变量“隐式展开”。是的,你是对的,我的措辞很糟糕。我将修复它,因为我需要通过方法调用来设置属性,所以它不起作用。我希望能够有一个
更新(来自数据:[String:Any])
函数,该函数重用初始化代码来设置所有实例变量。在init和update方法中复制完全相同的代码似乎很愚蠢,但是如果不隐式地打开所有变量,我就无法集中这些代码。这就是问题所在。如何在init中调用函数,而不让所有属性在使用时都是可选的。默认值似乎很愚蠢,因为它们永远不会被使用,但也许这就是答案。听起来你需要有默认值,但整个解决方案有点奇怪。首先在init方法中将所有属性设置为特定的值,然后再修改对象的所有参数,如果完全更改对象,那么最好创建一个新实例。我知道,但这并不能真正回答问题。问题是,为什么隐式展开的实例变量在类外实际使用时被视为正则选项。在我看来,它们要么继续隐式展开,要么一起是非可选的。如果我在使用它们的时候还必须将它们拆开的话,那就有点失败(至少是部分失败)。我知道这一点,但这并不能真正回答问题。问题是,为什么隐式展开的实例变量在类外实际使用时被视为正则选项。在我看来,它们要么继续隐式展开,要么一起是非可选的。如果我在使用它们的时候还必须将它们拆开的话,那么这是一种失败(至少是部分失败)。