非可选String自动更改为可选

问题描述 投票:-4回答:3

我遇到一个问题,我创建的对象是一个非可选值但不知何故它被转换为可选的值。

我在操场上试过也参考下面的截图。有谁知道我错过了什么?

enter image description here

ios swift swift-playground
3个回答
0
投票

只需删除隐式未包装的可选符号!。像这样的课:

import UIKit

class SomeDataModelClass {
    var someProperty: String

    init(someProperty: String) {
        self.someProperty = someProperty
    }
}

let someObject = SomeDataModelClass(someProperty: "Non Optional String")
print(someObject.someProperty)

你不会得到以前的结果。


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的新心理模型是你认为!?的同义词的一个例子,另外它在声明中添加了一个标志,让编译器知道声明的值可以被隐式解包。

在您的情况下,特别是,您正在打印一个隐式解包的可选项,这实际上只是一个花哨的可选项,因此它是预期和正确的行为。如果要打印字符串值本身,则需要显式解包值print(someObject.someProperty!)。链接的博客文章深入探讨了IUO的新重新实现,值得一试。


0
投票

隐式展开的可选项仍然是可选的。当你编写代码时,它看起来并不像那样。所以这个属性仍然没有价值。


但是根据您的具体需要,没有理由隐式解包可选。使其成为非可选或可选。您也可以使用struct而不是类,然后您可以使用默认的memberwise intializer

struct Model {
    var property: String
}

let object = Model(property: "text")
print(object.property)

text

© www.soinside.com 2019 - 2024. All rights reserved.