什么是 NSMutable 数组/字符串/URL?

Bri*_*ure 1 cocoa ios swift

有时我在将变量定义为 时遇到错误NSArray/String/URL,通常可以通过将其更改为 来解决NSMutableArray/String/URL

它们之间有什么区别?人们说你不能改变 a 的值NSString,但既然我将它定义为带有 a 的变量,为什么不呢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
    }
}
Run Code Online (Sandbox Code Playgroud)

Gle*_*enn 5

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()
Run Code Online (Sandbox Code Playgroud)

或者

var anEmtpyString = ""
Run Code Online (Sandbox Code Playgroud)

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

var myString = "first text"
myString = "another text"
Run Code Online (Sandbox Code Playgroud)

如果您使用“let”,则创建对字符串的引用,也称为不可变

let myString = "first text"
myString = "another text" // <- the compiler won't accept this !
Run Code Online (Sandbox Code Playgroud)

在这些示例中,我使用了 Swift 的原生 String 类型,该类型存在于 Swift 1.2 和 2 中

我还可以使用 Cocoa/Objective 类型 NSString、NSMutableString 但大多数时候不需要它。如果您使用的是用 Objective-C 编写的框架,它会很方便。这对你来说更容易,因为你不必从 String 转换为 NSString/NSMutableString。(这当然是可能的)

在 Objective-C 中没有 let 或 var 关键字,因此您使用 NSString (用于 let)和 NSMutableString (用于 var)。

NSArray/NSMutableArray 也是如此

更多信息:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html

PS gnasher729 的答案更具技术性,并告诉您它在幕后是如何进行的。这一切都与指针有关,指针在 Objective-C 中非常常见,但在 Swift 中则隐藏得多。如果您来自学习过指针的背景,它会让事情变得更清楚,如果没有,我不确定它是否会对您有帮助。如果您希望我对此进行扩展,请告诉我。