注意:这篇文章已经多次修改过。
问题:我尝试将全局var链接(浅层复制)到本地var以扩大其范围。
我可以分配本地数组'照片'进入空阵列' photoInfos'。
不幸的是,这并没有转化为全球性的“photoInfos”。
编译器抱怨我需要init()或getter / setter方法。
所以经过一些研究后,我为 Globals 提出计算 ivars:
import UIKit
var photoInfos = Array<Dictionary<String,String>>()
var gPhotoInfos:Array<Dictionary<String,String>> {
set {
photoInfos = newValue
}
get {
return photoInfos
}
}
...
let myPhotos = responseDict["photos"] as? NSDictionary
let photos: AnyObject? = myPhotos!["photo"]
// ...assigning to a local empty var works:
var myPersonalPhotos:AnyObject?
myPersonalPhotos = photos
println(myPersonalPhotos)
gPhotoInfos = photos // <--- compile error.
不幸的是我得到了这个:
...Cannot convert the expression's type '()' to type 'Array<Dictionary<String, String>>'
问题:我是否正在将本地 var移植到各自的全球 iVar中?
答案 0 :(得分:0)
你不需要使用计算属性(它们在Swift中不被称为ivars)。
问题很简单,类型是不兼容的,Swift是类型安全的。
您可以声明gPhotoInfos
:
var gPhotoInfos : Array<Dictionary<String,String>>
或者,更简洁:
var gPhotoInfos : [[String : String]]
分配失败,因为您已将photos
声明为可选的AnyObject(AnyObject?
)。
如果photos
实际上是一个字符串/字符串字典数组,那么您可以将可选和向下转换打包为正确的类型。之后,任务将起作用。例如:
if let unwrappedPhotos = photos {
//unwrappedPhotos is now AnyObject instead of AnyObject?
if let typedUnwrappedPhotos = unwrappedPhotos as? [[String : String]] {
gPhotoInfos = typedUnwrappedPhotos
} else {
// photos is some other type, not [[String : String]]
}
} else {
// photos is nil
}
通过组合展开和向下转换,您可以做得更短:
if let unwrappedPhotos = photos? as? [[String : String]] {
//unwrappedPhotos is now [[String : String]]
gPhotoInfos = unwrappedPhotos
} else {
// photos is either nil or not unwrappedPhotos
}
答案 1 :(得分:-1)
改变这个:
if let myPhotos = photos {
photoInfos = myPhotos
} else {
println("*** WARNING: no photos. ***")
return
}
到此:
if (photos != nil)
{
photoInfos = photos!
}
else
{
println("*** WARNING: no photos. ***")
return
}