我创建了一个结构体,其中我有一个属性'_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 { }
功能在语言参考上没有记录.
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)
PhotoStruct
是一个struct
,因此是一个值类型。对于值类型,只有显式标记为的方法mutating
才能修改的属性self
,因此在计算属性中是不可能的。
如果您将其更改 PhotoStruct
为a,class
那么您的代码将毫无问题地进行编译。
归档时间: |
|
查看次数: |
10576 次 |
最近记录: |