我想创建一个包含字符串的空数组。
以下两种方法之间有什么区别?哪种方法更好?
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] = []
。但这是我的看法。