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中不太常见,