swift 中各种变量声明的区别

Difference between various type of Variable declaration in swift

我很困惑何时以及如何在 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

请说清楚一点,让我的困惑程度清楚一点。谢谢

Array 是 swift 类型,而 NSArray 是 objective C 类型。 NS 类 支持动态调度,技术上比纯 swift 类.

访问速度稍慢

1) var arr = NSArray()

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

2) var arr = NSMutableArray()

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

3) var arr = Array()

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

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

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?

您在这里定义了一个可选数组。这意味着 arrnil 的值开始,如果以后需要,您可以为其分配一个数组 - 或者将其保留为 nil。这里的优点是,在 class/struct 中,您实际上不必在初始化程序

中为 arr 设置值

5) var arr : NSMutableArray = []

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

可选意味着它可以或者它不能

当您输入 type? 时,这意味着它是 nil 除非您给它赋值,因此您必须 unwrap 它才能访问值并使用它。

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

我又靠近我的电脑了...在下面的代码中,您可以看到swift和基础数组

之间的主要区别
import Foundation

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

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

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

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