当前位置: 首页 > 面试题库 >

String和有什么不一样?和弦!(创建可选变量的两种方式)?

潘宸
2023-03-14
问题内容

《 Swift编程语言》 (Apple书)中,我读到可以用两种方式创建可选变量:使用问号(?)或使用感叹号(!)。

区别在于,当使用(?)获得可选值时,每次需要该值时都必须使用感叹号:

var str: String? = "Question mark?"
println(str!) // Exclamation mark needed
str = nil

使用(!)时,您可以不带后缀:

var str: String! = "Exclamation mark!"
println(str) // No suffix needed
str = nil

有什么区别?如果根本没有区别,为什么有2种方法呢?


问题答案:

当两个类相互指向并且您需要避免强引用循环时,使用隐式解开的可选变量(用!声明)的真正好处与类初始化有关。例如:

A级<-> B级

A类的初始化例程需要创建(并拥有)B类,而B需要对A的弱引用:

class A {
    let instanceOfB: B!
    init() {
        self.instanceOfB = B(instanceOfA: self)
    }
}

class B {
    unowned let instanceOfA: A
    init(instanceOfA: A) {
        self.instanceOfA = instanceOfA
    }
}

现在,

  • B类需要引用要初始化的A类。
  • A类只有self在完全初始化后才能传递给B类的初始化器。
  • 为了使A类在创建B类之前被视为已初始化,instanceOfB因此该属性必须是可选的。

但是,一旦创建了A,就不得不使用instanceOfB访问instanceOfB!因为我们 知道 必须有一个B

为了避免这种情况,instanceOfB被声明为一个隐式未包装的可选(instanceOfB!),我们可以仅使用instanceOfB对其进行访问。(此外,我
怀疑 编译器也可以不同地优化访问)。

这本书的第464至466页给出了一个示例。

摘要:

  • 用 ?如果该值将来可能变为零,以便对此进行测试
  • 用 !如果它将来真的不应该变为零,但是最初需要为零。


 类似资料:
  • 本文向大家介绍基于String变量的两种创建方式(详解),包括了基于String变量的两种创建方式(详解)的使用技巧和注意事项,需要的朋友参考一下 在java中,有两种创建String类型变量的方式: 第一种方式创建String变量时,首先查找JVM方法区的字符串常量池是否存在存放"abc"的地址,如果存在,则将该变量指向这个地址,不存在,则在方法区创建一个存放字面值"abc"的地址。 第二种方式

  • 我们可以对String数组有两个声明 1. 2个 有人能告诉我区别吗

  • 问题内容: 我是一名新的Java学习者。最近,我在阅读泛型编程,并对此感到困惑。 问题答案: 首先,这些是在不同上下文中使用的完全不同的构造。 是通用类型声明的一部分,例如 它使用类型参数声明泛型类型,并引入界限,因此必须是的子类型。 是带通配符的参数化类型,可以作为普通类型用于变量和方法声明等中: 变量声明诸如装置类型的该被参数化与一些亚型。 例如,给出此声明 您可以: 将的某些子类型分配给:

  • 问题内容: 不会初始化内存,只会将其清零。它返回一个指向新分配的零值的指针。 仅创建切片,地图和通道,并将其初始化返回。 在这种情况下,“初始化”是什么意思?new和make之间还有什么其他区别? 问题答案: 如制作切片,地图和通道中所述: 内置函数make需要一个type ,该类型 必须是slice,map或channel type ,还可以选择后面是特定于类型的表达式列表。 它返回类型的值(不

  • 本文向大家介绍JS创建类和对象的两种不同方式,包括了JS创建类和对象的两种不同方式的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中, 当你定义了一个新的函数, 你实际上声明了一个新的类, 而这个函数本身就相当于类的构造函数。下面的代码向你展示了两种不同的方式来创建一个新的Person类, 而Person.prototype的定义也紧跟在函数定义之后。 当你通过函数的方式声明了一个

  • 问题内容: 关于 Java泛型, 我有一个非常基本的问题。我想这两个和是同质的。我是对的还是我缺少的基本观念? 问题答案: 泛型类型比较古怪。 表示Number或未知的子类。如果获得这样的值,它将是,但是由于您不知道哪个有效,因此无法给出此类型的值。 区别在于参数和返回值。 在一些地方用来表示类型可以是超级类型。例如 在集合中,此方法表示比较器需要能够比较相同类型或任何超级类型。 这意味着你可以