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?
您在这里定义了一个可选数组。这意味着 arr
以 nil
的值开始,如果以后需要,您可以为其分配一个数组 - 或者将其保留为 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>
我很困惑何时以及如何在 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?
您在这里定义了一个可选数组。这意味着 arr
以 nil
的值开始,如果以后需要,您可以为其分配一个数组 - 或者将其保留为 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>