Arrays 作为视图控制器的成员变量,这些数组之间的差异

Arrays 作为视图控制器的成员变量,这些数组之间的差异,arrays,swift,member,Arrays,Swift,Member,我希望有一个数组作为我的表视图控制器的成员。该数组将是一个数据源 使用成员变量数组的以下方法的区别或优缺点是什么 class BinViewController: UITableViewController, WKNavigationDelegate { var peopleArray1 = [String]() var peopleArray2: [String] = [] var peopleArray3: [String]! var peopleArray4

我希望有一个数组作为我的表视图控制器的成员。该数组将是一个数据源

使用成员变量数组的以下方法的区别或优缺点是什么

class BinViewController: UITableViewController, WKNavigationDelegate {
    var peopleArray1 = [String]()
    var peopleArray2: [String] = []
    var peopleArray3: [String]!
    var peopleArray4: [String]?

这两个基本上做相同的事情:

var peopleArray1 = [String]()
var peopleArray2: [String] = []
它们声明并初始化类型为
[String]
的空数组


另一方面,这两个也很相似:

var peopleArray3: [String]!
var peopleArray4: [String]?
这两个变量的数组本身可以是
nil
,它们当前的状态与声明的状态相同

不同之处在于
peopleArray3
是一个隐式展开的可选字符串数组,而
peopleArray4
是一个可选字符串数组

这对
peopleArray3
来说意味着,您告诉编译器,在使用它之前,您将为它设置一个值。如果您试图在其值为
nil
时访问它,应用程序将崩溃


对于
peopleArray4
,您告诉编译器数组在任何时候都可能是
nil
,因此在访问它之前,您需要检查
peopleArray4
是否不是
nil

我认为你不需要问自己正确的问题。没有优势也没有劣势。根据需要和要实现的逻辑,有几种方法可以初始化类的成员

  • var peopleArray1=[String]()
    您是在对编译器说,请让我创建一个空字符串数组它被声明并初始化。还可以让编译器根据第二条语句推断数组的类型

  • var peopleArray2:[String]=[]
    这与您的第一条语句有99%的相同之处。您正在创建一个空字符串数组。声明并初始化。这里唯一的区别是指定数组的类型。不允许编译器推断数组的类型<代码>变量变量:类型变量=…苹果公司建议,如果可以的话,让编译器推断变量成员的类型,因为你赢得了可读代码

  • var peopleArray3:[字符串]它与之前的2次初始化非常不同。首先,您需要知道Swift是一种非常强类型的语言,您需要在使用它之前初始化每个变量。您可以尝试的一件事是尝试在不使用!或你会发现你的编译器警告你一个问题。有时你只是不知道初始值是多少,但你确信在某一时刻,你会有一个值。变量是这两种可能的状态:无值或值被称为选项。通过这个语句,您可以说我想创建一个字符串数组,该数组可能为nil,也可能有一些字符串值。如果打印数组,则会出现类似“可选([String])”的消息。要获取可选项的值,只有在确定有值时,才需要使用感叹号将其展开。否则,您的程序将崩溃。在这里进行初始化时,您要告诉编译器不要担心,因为您知道在将来数组将有一些值

  • var peopleArray4:[String]?
    与上一个相同。主要的区别是,每次你想要访问peopleArray值时,你都需要放一个感叹号来打开他的值。 使用选项并没有任何优势/劣势。如果您的数组可能为nil并进一步具有值,或者它是一个静态数组


这是有关Swift和属性声明和初始化的基本问题。你看过这本书了吗?关于这四行代码,您有哪些具体问题?你到底不明白他们之间的差异是什么?请澄清您的问题(不要发表评论)。