只需删除隐式未包装的可选符号!
。像这样的课:
import UIKit
class SomeDataModelClass {
var someProperty: String
init(someProperty: String) {
self.someProperty = someProperty
}
}
let someObject = SomeDataModelClass(someProperty: "Non Optional String")
print(someObject.someProperty)
你不会得到以前的结果。
隐式展开的选项(任何以!
为后缀的类型)都是表面下方的选项。最近在Swift 4+中发生了变化。以下是Swift.org博客Reimplementation of Implicitly Unwrapped Optionals的摘录(重点补充):
隐式解包的选项是在需要编译表达式时自动解包的选项。要声明一个隐式展开的可选项,请在类型名称后面放置一个
!
而不是?
。许多人对于隐式解包的选项而言的心理模型是它们是一种类型,与常规选项不同。在Swift 3中,这正是它们的工作方式:像
var a: Int?
这样的声明会导致a
具有类型Optional<Int>
,而像var b: String!
这样的声明会导致b
具有ImplicitlyUnwrappedOptional<String>
类型。IUO的新心理模型是你认为
!
是?
的同义词的一个例子,另外它在声明中添加了一个标志,让编译器知道声明的值可以被隐式解包。
在您的情况下,特别是,您正在打印一个隐式解包的可选项,这实际上只是一个花哨的可选项,因此它是预期和正确的行为。如果要打印字符串值本身,则需要显式解包值print(someObject.someProperty!)
。链接的博客文章深入探讨了IUO的新重新实现,值得一试。
隐式展开的可选项仍然是可选的。当你编写代码时,它看起来并不像那样。所以这个属性仍然没有价值。
但是根据您的具体需要,没有理由隐式解包可选。使其成为非可选或可选。您也可以使用struct
而不是类,然后您可以使用默认的memberwise intializer
struct Model {
var property: String
}
let object = Model(property: "text")
print(object.property)
text