swift中各种类型的变量声明之间的区别

时间:2015-12-05 11:14:46

标签: swift ios9 variable-declaration

我很困惑何时以及如何在Swift中的特定点声明变量,这对SWIFT中像我这样的新人造成了头疼。

以下类型的声明有什么区别?我对他们给出了我的想法和理解。如果我错了,请用你的解决方案纠正我,并有点解释,以便我能够知道实际和准确的答案。

  Array - 
   1) var arr = NSArray()//I think its an instance of immutable NSArray type
   2) var arr = NSMutableArray()
   3) var arr = Array()//I have no idea of difference between NSArray and Array type. Might be both are same
   4) var arr : NSMutableArray?//Creates an optional type but how is it different from line no.2
   5) var arr : NSMutableArray = []//creates an empty array NSMutableArray type and again how is it different from line no.2 & 3

请澄清一下,以便我的混乱程度有点清楚。感谢

2 个答案:

答案 0 :(得分:2)

Array是一种快速类型,其中NSArray是目标C类型。 NS类支持动态调度,技术上访问速度比纯swift类稍慢。

  

1)var arr = NSArray()

arr此处为NSArray() - 您可以将内容重新分配给arr,但无法更改NSArray()的内容 - 这是一个不错的选择使用IMO,因为你已经在变量中放入了一个不可用的数组。我真的想不出你想打这个电话的原因。

  

2)var arr = NSMutableArray()

这里有一些可用的东西。因为数组是可变的,你可以添加和删除它的项目

  

3)var arr = Array()

这不会编译 - 但var arr = Array<Int>()会。

Array采用通用元素类型(如下所示)

public struct Array<Element> : CollectionType, MutableCollectionType, _DestructorSafeContainer {
    /// Always zero, which is the index of the first element when non-empty.
    public var startIndex: Int { get }
    /// A "past-the-end" element index; the successor of the last valid
    /// subscript argument.
    public var endIndex: Int { get }
    public subscript (index: Int) -> Element
    public subscript (subRange: Range<Int>) -> ArraySlice<Element>
}
  

4)var arr:NSMutableArray?

您在此处定义可选数组。这意味着arr以值nil开头,如果您以后需要,则为其分配一个数组 - 或者只保留为零。这样做的好处是,在您的类/结构中,您实际上不必在初始化程序中为arr设置值

  

5)var arr:NSMutableArray = []

enter image description here

听起来你对可选值感到困惑。

可选表示可以 nil

当您输入type?这意味着它是nil时,除非您为其指定了某些内容,因此您必须展开来访问这些值并使用它

答案 1 :(得分:0)

@ G.Abhisek起初关于你的问题。 var arr: NSMutableArray = []var arr = NSMutableArray()表示相同。第一个意思是,我要求编译器创建一个NSMutableArray类型的变量,并将其初始化为空的NSMutableArray。第二个意思是,我要求编译器创建一个变量并为其分配一个空的初始化NSMutableArray。在第二种情况下,编译器必须推断出正确的变量类型,在第一种情况下,我自己做了。仍然,结果将是相同的。 var arr1: Array<AnyObject> = []var arr2: NSMutableArray = []完全不同! arr1 srores value type Array,arr2存储对空NSMutableArray类的实例的引用。你可以写let arr2: NSMutableArray = []然后你可以在那里添加一个对象......但你不能像arr2 = ["a","b"]那样思考。 arr2是常量,而不是变量,因此存储在那里的值是不可变的。

我再次靠近我的电脑...在下面的代码中,你可以看到swift和基础数组之间的主要区别

import Foundation

let arr1: NSMutableArray = []
arr1.addObject("a")
arr1.addObject(10)
arr1.forEach {
    print($0, $0.dynamicType)
    /*
        a _NSContiguousString
        10 __NSCFNumber
    */
}

var arr2: Array<Any> = []
arr2.append("a")
arr2.append(10)
arr2.forEach {
    print($0, $0.dynamicType)
    /*
        a String
        10 Int
    */
}

var arr3: Array<AnyObject> = []
arr3.append("a")
arr3.append(10)
arr3.forEach {
    print($0, $0.dynamicType)
    /*
    a _NSContiguousString
    10 __NSCFNumber
    */
}

print(arr1.dynamicType, arr2.dynamicType, arr3.dynamicType)
// __NSArrayM Array<protocol<>> Array<AnyObject>