答案 0 :(得分:0)
只需删除隐式解包的可选符号!
。像这样上课:
import UIKit
class SomeDataModelClass {
var someProperty: String
init(someProperty: String) {
self.someProperty = someProperty
}
}
let someObject = SomeDataModelClass(someProperty: "Non Optional String")
print(someObject.someProperty)
您将不会获得先前的结果。
答案 1 :(得分:0)
显式展开的可选对象(后缀为!
的任何类型)是表面之下的可选对象。最近在Swift 4+中更改了此功能。这是Swift.org博客Reimplementation of Implicitly Unwrapped Optionals的摘录(重点强调):
展开式可选内容是可选的选项,如果需要编译表达式,该选项将自动展开。要声明隐式展开的可选内容,请在类型名称后放置
!
而不是?
。许多人对于隐式解开的可选对象的思维模型是,它们是一种类型,不同于常规的可选对象。在Swift 3中,这是完全的工作方式:像
var a: Int?
这样的声明将导致a
的类型为Optional<Int>
,而像var b: String!
这样的声明将导致b
的类型为ImplicitlyUnwrappedOptional<String>
。用于IUO的 new 心理模型是一种您认为
!
是?
的同义词的模型,另外它在声明上添加了一个标志,使编译器可以使用知道声明的值可以隐式展开。
具体来说,您要打印一个隐式解包的可选内容,它实际上只是一个奇特的可选内容,因此它是预期的正确行为。如果要打印字符串值本身,则需要明确展开值print(someObject.someProperty!)
。链接的博客文章深入探讨了IUO的新实现,值得一看。
答案 2 :(得分:0)
隐式解包的可选仍然是可选的。编写代码时看起来并不像那样。因此,此属性仍然无法保留任何值。
但是对于您的特定需求,没有理由使用隐式解包的可选。使它成为非可选或可选。另外,您可以使用struct
代替类,然后可以使用默认的成员级初始化器
struct Model {
var property: String
}
let object = Model(property: "text")
print(object.property)
text