0

我无法理解显式声明的字符串和隐式展开的可选字符串之间的区别。

例如,

如果我们显式地初始化一个字符串,

let assumedString:String = "Test String"
print(assumedString)

给出输出

"Test String"
"Test String\n"

在操场上。

同样,如果我们像这样隐式地打开一个可选字符串,

let assumedString:String! = "Test String"
print(assumedString)

给出相同的输出

"Test String"
"Test String\n"

而且一旦我们使用“!” 初始化时,其值不能为 nil。所以我们可以使用显式类型吗?

那我们为什么要使用使用'!'的概念?(隐式展开可选字符串)。

请解释使用“!”的区别或用法 如果可能,请提供代码示例。

4

2 回答 2

2

在您的示例中,您仅使用let常量。使用let常量,您几乎看不到两者之间的区别。情况发生变化。

如您所知,类中的所有属性都必须在初始化程序中初始化为某个值。可选属性是此规则的一个例外。它们是默认的,nil即没有值。

当我有一个存储视图高度或任何与 UI 相关的属性时,我最常使用隐式展开的选项。我总是将它们声明为隐式展开的选项。例如

var myViewsHeight: CGFloat!

override func viewDidLoad() {
    myViewsHeight = self.view.viewWithTag(1).frame.height
}

您显然无法在 in 中初始化该变量,init因为 atinit尚未布置视图!没有办法知道视图的高度。您将其设为隐式展开的可选项,因为您知道它将viewDidLoad. 这样做的另一个优点是它使跟踪错误更容易。假设您的应用程序崩溃了,因为如果发生了某些事情viewDidLoad并且没有执行初始化的行myViewsHeight,您将立即知道,因为您的应用程序崩溃了!

您还将看到所有IBOutlets 都是隐式展开的选项,出于同样的原因 - 视图不能在init.

于 2016-11-11T07:58:49.357 回答
0
let assumedString:String = "Test String" 

意味着您只需定义一个字符串常量,但是当您编写

let assumedString:String! = "Test String" 

表示您正在声明一个可选类型的字符串。因此,它可能包含或不包含值。但是在这里,您在声明 string 时被初始化。所以,如果你打印两者都会给出相同的输出。如需更多了解,请访问以下链接

var someString = “Some String”, var someString: String = “Some String”, var someString = “Some String” as string 的区别

于 2016-11-11T08:07:32.290 回答