Ios 什么是可变数组/字符串/URL?

Ios 什么是可变数组/字符串/URL?,ios,swift,cocoa,Ios,Swift,Cocoa,有时我在将变量定义为NSArray/String/URL时会出错,通常可以将其更改为NSMutableArray/String/URL 他们之间有什么区别?人们说您不能更改NSString的值,但既然我用var将其定义为变量,为什么不更改呢 请使用Swift 2代码进行解释 下面是代码示例: enum Router: URLRequestConvertible { static let baseURLString = "https://api.500px.com/v1" sta

有时我在将变量定义为
NSArray/String/URL
时会出错,通常可以将其更改为
NSMutableArray/String/URL

他们之间有什么区别?人们说您不能更改
NSString
的值,但既然我用
var
将其定义为变量,为什么不更改呢

请使用Swift 2代码进行解释

下面是代码示例:

enum Router: URLRequestConvertible {

    static let baseURLString = "https://api.500px.com/v1"
    static let consumerKey = "My_Key"

    case PopularPhotos(Int)
    case PhotoInfo(Int, ImageSize)
    case Comments(Int, Int)

    var URLRequest: NSURLRequest {
    //Error: Type does not conform to protocol 'URLRequestConvertible' with Alamofire. 
    //I solved this problem by changing it to NSMutableRequest. 

        let (path, parameters) : (String, [String: AnyObject]) = {

            switch self {

            //3 cases. 

            }
        }()

        let URL = NSURL(string: Router.baseURLString)
        let URLRequest = NSURLRequest(URL: URL!.URLByAppendingPathComponent(path))
        let encoding = Alamofire.ParameterEncoding.URL

        return encoding.encode(URLRequest, parameters: parameters).0
    }
}

NS类型来自Cocoa(有些人会说Objective-c,但实际上它们在Objective-c中不存在,所以它们是在NextStep库中创建的,然后在Apple购买NextStep后在Cocoa中使用->因此使用NS前缀)

NSArray/String/URL类似于let myVar=“aString”

NSMutableArray/String/URL类似于var myVar=“aString”

第一个在设置后不能更改,第二个可以更改。为什么使用Cocoa/Objective-C类型而不是本机Swift类型

编辑(见评论)

在Swift中,可以定义字符串:

var anEmtpyString = String()

在第二种情况下,Swift足够聪明,可以推断类型是字符串。如果使用“var”,则字符串是可变的,这意味着您可以在以后更改它。所以我可以做到:

var myString = "first text"
myString = "another text"
如果使用“let”,则创建对字符串的引用,也称为不可变

let myString = "first text"
myString = "another text" // <- the compiler won't accept this !
让myString=“第一个文本”

myString=“other text”//NS类型来自Cocoa(有些人会说Objective-c,但实际上它们在Objective-c中不存在,所以它们是在NextStep库中创建的,然后在Apple购买NextStep后在Cocoa中使用->因此使用NS前缀)

NSArray/String/URL类似于let myVar=“aString”

NSMutableArray/String/URL类似于var myVar=“aString”

第一个在设置后不能更改,第二个可以更改。为什么使用Cocoa/Objective-C类型而不是本机Swift类型

编辑(见评论)

在Swift中,可以定义字符串:

var anEmtpyString = String()

在第二种情况下,Swift足够聪明,可以推断类型是字符串。如果使用“var”,则字符串是可变的,这意味着您可以在以后更改它。所以我可以做到:

var myString = "first text"
myString = "another text"
如果使用“let”,则创建对字符串的引用,也称为不可变

let myString = "first text"
myString = "another text" // <- the compiler won't accept this !
让myString=“第一个文本”

myString=“其他文本”//有值对象和引用对象。例如,Int和String是值对象,NSNumber和NSString是引用对象。Swift结构实例是值对象,Swift类实例是引用对象


对于引用对象,变量不是对象。它是对对象的引用。所以“let”变量不能更改,这意味着它引用一个对象,不能使它引用另一个对象。“var”变量可以更改,这意味着可以使其引用不同的对象。但两者都没有提到物体本身。无法修改NSArray对象,可以修改NSMutableArray。无论您使用let或var变量来引用对象,都只意味着该变量不能或可以被设置为引用不同的变量,而不是说您是否可以修改对象本身

有值对象和引用对象。例如,Int和String是值对象,NSNumber和NSString是引用对象。Swift结构实例是值对象,Swift类实例是引用对象

对于引用对象,变量不是对象。它是对对象的引用。所以“let”变量不能更改,这意味着它引用一个对象,不能使它引用另一个对象。“var”变量可以更改,这意味着可以使其引用不同的对象。但两者都没有提到物体本身。无法修改NSArray对象,可以修改NSMutableArray。无论您使用let或var变量来引用对象,都只意味着该变量不能或可以被设置为引用不同的变量,而不是说您是否可以修改对象本身

A

在Objective-C中,您日常生活中的许多类型都不是内置类型。这意味着它们不是编程语言的一部分

因此,框架基础将类型定义为与任何其他类一样的类。像

NSImage
NSManagedObject
NSWhatever
这样的类没有区别。您没有语言级别的文档。它们作为框架的一部分进行记录。您可以将它们视为其他所有类,包括子类化、类别等。他们没有什么特别之处。(您可以完全替换它们,但没有什么理由这样做。)

B

在Objective-C中,每个实例对象都在堆上分配(“动态”)。由于
NSString
的实例是常用的实例对象,因此可以对它们执行相同的操作。这种构造的返回值不是实例对象,而是对实例对象的引用。这意味着所有实例对象(包括
NSString
的实例)都“通过引用”处理

使用“字符串类型”定义变量时,不定义字符串实例,而是定义对字符串的引用:

NSString *referenceToString;
此引用始终是一个变量。在Swift中,它将如下所示:

var string : String;
Objective-C中常量的类比是用关键字
const
定义的

NSString * const referenceToString; 
但是有一个很大的区别:由于您声明的变量是引用,常量可以与引用或对象相关。在第一种情况下,您无法更改引用,在后一种情况下,您无法更改对象。上述语法的意思是:对
NSString
实例的常量引用。因此,不允许为该引用赋值。(即引用另一个字符串对象。)

这些常量引用在Objective-C中不太常见,