有时我在将变量定义为 时遇到错误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)
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 也是如此
PS gnasher729 的答案更具技术性,并告诉您它在幕后是如何进行的。这一切都与指针有关,指针在 Objective-C 中非常常见,但在 Swift 中则隐藏得多。如果您来自学习过指针的背景,它会让事情变得更清楚,如果没有,我不确定它是否会对您有帮助。如果您希望我对此进行扩展,请告诉我。
归档时间: |
|
查看次数: |
339 次 |
最近记录: |