【问题标题】:Difference between various type of Variable declaration in swiftswift中各种类型的变量声明之间的区别
【发布时间】:2015-12-05 11:14:46
【问题描述】:

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

请澄清一点,这样我的困惑程度就会有点清楚。谢谢

【问题讨论】:

  • 解释你认为他们都是什么
  • @Wain 我正在用我的观点编辑我的问题。请纠正我并解释一下。我已经更新了我的问题。

标签: swift ios9 variable-declaration


【解决方案1】:

Array 是一个 swift 类型,而 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?

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

5) var arr : NSMutableArray = []

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

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

当您键入 type? 时,这意味着它是 nil,除非您为其分配了某些内容,因此您必须解包它才能访问这些值并使用它。

【讨论】:

  • 第 3 & 4 & 5 行有什么区别?
  • @user3441734 为什么不可能。斯威夫特说你可以通过在特定类型之后添加“()”来拥有特定类型的实例。
  • @Array 是通用容器。编译器必须知道您要在其中存储哪种类型的值。 var arr: Array = [] 意味着我需要一个可变存储(变量),它的类型是一个整数数组,我要求编译器创建一个空数组作为我的变量的初始值
  • #5 与 #2 相同。您正在声明一个 NSMutableArray 并将其初始化为一个空数组。你到达那里的方式是不同的。在 #2 中,Swift 从分配给它的数组中推断出 arr 的类型。在 #5 中,您明确声明了类型,因此当您说 [] 时,Swift 可以推断出要创建的数组类型。
  • @Jeef,您仍然需要修复 #3。这个不编译:Generic parameter 'Element' could not be inferred.
【解决方案2】:

@G.Abhisek 首先是关于你的问题。 var arr: NSMutableArray = []var arr = NSMutableArray() 含义相同。第一个意思是,我要求编译器创建一个 NSMutableArray 类型的变量并将其初始化为一个空的 NSMutableArray。第二个意思是,我要求编译器创建一个变量并为其分配一个空的初始化 NSMutableArray。在第二种情况下,编译器必须推断变量的正确类型,在第一种情况下,我自己做了。尽管如此,结果还是一样的。 var arr1: Array&lt;AnyObject&gt; = []var arr2: NSMutableArray = [] 是完全不同的东西! arr1 存储值类型数组,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>

【讨论】:

  • 你能告诉我如何声明一个可选的 NSMutableArray- var arr = NSMutableArray() 吗?导致错误?
猜你喜欢
  • 2020-10-13
  • 2011-03-27
  • 1970-01-01
  • 2012-01-11
  • 2015-07-29
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
相关资源
最近更新 更多