var arr:[String]=[]和var arr=[String]()之间的Swift差异



我想创建一个包含字符串的空数组。

以下两种方法之间有什么区别?哪种方法更好?

var arr:[String] = []
// versus
var arr = [String]()

AFAIU,第一种方法本质上等效于具有空文本集的Array<String>(arrayLiteral: ...)。第二个只是Array<String>()。尽管最终结果相同,但后者应该更可取,因为它的执行成本更低。您可以通过逐步进入指令调试这两个选项来探索这一点。

第一个var arr:[String] = []通常用于在初始化时添加值。您可以像这样创建一个空数组,但通常您会执行第二个操作来创建空数组:var are = [String]()

任何一种都是可以接受的,但通常你会在初始化时使用第一种来添加值,就像你对普通变量一样:你通常会写这样的东西:

var exampleVariable:String = "Example String" 

比较第二个,就像写:

var exampleVariable = String()

简单地说,您添加方括号来表示您正在制作一个数组。

我很晚才回答这个问题,因为它不见了,在我看来,它们的关键词是Type Annotation&Type Inference

var arr: [String] = []

您正在声明一个类型为[String](字符串数组)的变量arr,其中包含: [String]部分。是Type Annotation
然后用[]分配它的值,即创建一个空数组,由于编译器知道它是String的数组,所以它将创建一个字符串的空数组。

var arr = [String]()

您创建的变量arr没有指定其类型。然后,使用String数组([String]()[String].init()的缩写)初始化该变量
然后,编译器通过初始化知道arr的类型
那是Type Inference。但如果你写:

var arr = []

编译器不知道arr是什么,您需要在用myVar: ItsType声明变量时告诉它,或者在初始化时告诉它(如果用= [String]()
所以您将得到编译器错误:Empty collection literal requires an explicit type

通常,同时使用这两种方法都是夸大其词,过于冗长。

然后你也可以写:

// Using Type Annotation:
// Declaring the variable type, the initialization doesn't need to specify it
var arr: [String] = []
var arr: Array<String> = []
// Using Type inference:
// Initialization is expliciting the type, the type is then "guessed".
var arr = [String]()
var arr = [String].init()
var arr = Array<String>()
var arr = Array<String>.init()
// Using Type Annotation & Type Inference:
// Declaring the variable type, AND also the on the initialization
var arr: [String] = [String]()
var arr: [String] = [String].init()
var arr: Array<String> = [String]() 
var arr: Array<String> = [String].init()

就我而言,我更喜欢var arr: [String] = []。但这是我的看法。

最新更新