如何将(浅拷贝)全局变量链接到本地​​容器变量/常量?

时间:2014-09-24 19:03:55

标签: arrays swift optional

注意:这篇文章已经多次修改过。

问题:尝试将全局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中?

2 个答案:

答案 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
}