无法从计算属性中为存储属性赋值

RMH*_*RMH 15 swift

我创建了一个结构体,其中我有一个属性'_photo',当调用计算属性'photo'时,它会被懒惰地分配.我一直在收到错误

不能在'self'中指定'_photo'

这是代码.我在Swift 1.1(photo1)和swift 1.2(photo2)语法中编写了计算方法.两者都给出了如上所述的相同编译时错误.

修复该错误需要进行哪些更改?

import UIKit

public struct PhotoStruct {
    var _photo:UIImage?
    var urlString:String?

    init(image:UIImage?, url:String?){
        self._photo = image
        self.urlString = url

    }

    init(url:String?){
        self.urlString = url
    }


    var photo1:UIImage? {

        if let theURL = self._photo {
            return self._photo
        }else{
            if let urlString = self.urlString{
                if let url = NSURL(string: urlString as String){
                    if let imageData :NSData = NSData(contentsOfURL: url){
                        if let image:UIImage = UIImage(data:imageData){

                            self._photo = image //** Cannot assign error is here**
                        }
                    }
                }
            }
            return self._photo
        }
    }

    var photo2:UIImage? {

        if let theURL = self._photo {
            return self._photo
        }else{
            if let  urlString = self.urlString,
                    url = NSURL(string: urlString as String),
                    imageData :NSData = NSData(contentsOfURL: url),
                    image:UIImage = UIImage(data:imageData){

                            self._photo = image //** Cannot assign error is here**
            }
            return self._photo
        }
    }



}
Run Code Online (Sandbox Code Playgroud)

rin*_*aro 15

至于struct,如果要self在计算属性中改变属性,则必须将getter显式声明为mutating get { .. }

public struct PhotoStruct {
    var _photo:UIImage?
    var urlString:String?

    init(image:UIImage?, url:String?){
        self._photo = image
        self.urlString = url
    }

    init(url:String?){
        self.urlString = url
    }

    var photo1:UIImage? {
        mutating get {
    //  ^^^^^^^^^^^^
            // you can set `self._photo = image` here
        }
    }

    var photo2:UIImage? {
        mutating get {
    //  ^^^^^^^^^^^^
            // you can set `self._photo = image` here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,结构本身必须是可变的:

var pVar:PhotoStruct = PhotoStruct(image: nil, url: nil)
pVar.photo1 // no problem
let pLet:PhotoStruct = PhotoStruct(image: nil, url: nil)
pLet.photo1 // < [!] error: immutable value of type 'PhotoStruct' only has mutating members named 'photo1'
Run Code Online (Sandbox Code Playgroud)

一个警告:

据我所知,mutating get { }功能在语言参考上没有记录.

  • 有意思,不知道"变异得到". (2认同)

Kos*_*val 11

Structs是值类型,它们是不可变的.
这意味着您无法设置变量和变异自我.
如果你需要改变struct,你必须做mutating func

public struct PhotoStruct {
    var _photo:UIImage?
    var urlString:String?

   mutating func loadPhoto() -> UIImage {
    .. Code here
   _photo = UIImage(data:imageData)
   // Here you mutate a struct, but it's ok because we make method as mutating
  }
}
Run Code Online (Sandbox Code Playgroud)

在你的例子中,我将改变方法而不是属性

mutating func photo () -> UIImage? {

    if let photo = self._photo {
        return photo
    } else {
        if let urlString = self.urlString,
        url = NSURL(string: urlString),
        imageData = NSData(contentsOfURL: url),
        image = UIImage(data:imageData) {
            self._photo = image
        }
        return self._photo
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*n R 5

PhotoStruct是一个struct,因此是一个值类型。对于值类型,只有显式标记为的方法mutating才能修改的属性self,因此在计算属性中是不可能的。

如果您将其更改 PhotoStruct为a,class那么您的代码将毫无问题地进行编译。