gpt4 book ai didi

ios - Swift 中可选和非可选函数参数之间的语义和最佳用例

转载 作者:行者123 更新时间:2023-11-28 05:34:19 25 4
gpt4 key购买 nike

我看到很多关于 Swift 中声明为 var a: String?var a: String! 的变量的讨论,前者是一个可选变量String 类型,后者被隐式解包为可选 String。根据我的理解,当某些东西被隐式展开时,就会假设可选值中已经包含了一个值。为了使用语法 a!.toInt() 必须像这样进行外部检查:

if a != nil {
a!.toInt()
}

作为旁注,似乎更好的做法是将变量声明为可选类型,然后使用可选链接来解包值(如果存在)。正在做:

if let numberString = a?.toInt() {
numberString.toInt()
}

在实际应用中是否应该使用访问像 a!.toInt() 这样的变量的场景?在我看来,您似乎是在询问运行时错误。

现在是实际问题。我正在查看文档,特别是 NSArray 上的 enumerateObjectsUsingBlock 并且 block 参数是使用 ! 声明的。这是否意味着该函数的编写者假设 block 参数将非零?如果是这样,在该函数内部,之间的语义区别是什么:

func someMethodWithBlock(block:((String!)-> Void)!) {
var a = "Hello"
block.(a) //first syntax example
block?.(a)//2nd
block!.(a)//3rd
}

最佳答案

在 Cocoa API 中几乎所有地方都使用隐式解包选项,因为它们被导入到 Swift 中——这是为了保持与 Obj-C 中无处不在的指针语义的兼容性,而不需要 ! s 和 ? 无处不在。这就是 NSArray 方法的 block 采用 String! 参数的原因。

在 Swift 中,由于您指定的原因,常规可选值(Int? 等)在很大程度上是可取的:它们不太容易出错。隐式解包选项主要是为了在某些情况下使用,比如当你需要 pass self to a function before initialization is complete 时。 . (如果你知道一个变量不是 nil,像 a!.toInt() 那样展开它就很好。IUO 的危险在于它会被写成 a.toInt(),对于读者来说,这看起来是完全安全的,但实际上并非如此。)

关于ios - Swift 中可选和非可选函数参数之间的语义和最佳用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25345095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com