2016-08-04 4 views
9

유형의 불변 값에 돌연변이 멤버를 사용할 수 없습니다 : 나는 오류 다음 얻을내가 구조체 다음 한

final class SomeClass: SuperClass { 
    var data: SuperModel 
    init() { 
     self.data = ModelOne() 
    } 
    func someFunc() { 
     (self.data as! ModelOne).setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1)) 
    } 
} 

:

public protocol SuperModel { 
    // empty protocol 
} 
struct ModelOne: SuperModel { 
    struct SubModelOne { 
     var someVar: Double 
     var othervar: Double? 
    } 
    var sub: SubModelOne? 
    mutating func setSub(sub: SubModelOne) {   
     self.sub = sub 
    } 
} 

내 수업에서, 나는 그런이 구조체를 사용하려면 Cannot use mutating member on immutable value of type 'ModelOne' . 그 이유는 무엇이며 어떻게 해결할 수 있습니까?

+2

NetworkCheckModel이란 무엇입니까? 자체 포함 된 예제가 유용 할 것입니다. –

+0

시도해보십시오 var data = self.data as! ModelOne data.setSub (ModelOne.SubModelOne (someVar : 2, othervar : 1)) – Sahil

+0

@MartinR 유감스럽게도 내가 서두 르며 변경하는 것을 잊어 버렸습니다. 편집 – j0h4nn3s

답변

12

전화 ModelOne에 self.data 다운 캐스트 값 :

(self.data as! ModelOne) // this is copy of data 

수있는 유일한 방법 (나에게 알려진)은 주조 할 필요가 값을 변이 할 수있는 방법 - 값을 재 할당 (@Sahil로 당신이 변수를 선언해야한다고 지적했습니다.) :

func someFunc() { 
    if var data = data as? ModelOne { 
     data.setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1)) 
     self.data = data // you can do this since ModelOne conforms to SuperModel 
    } 
} 
+1

덕분에,이 작품! – j0h4nn3s

0

dataSuperModel으로 지정했지만 ModelOne으로 할당하면 문제가 발생합니다. dataModelOne으로 선언하십시오. 그런 다음 문제는 사라집니다.

final class SomeClass: SuperClass { 
    var data: ModelOne 
    init() { 
     self.data = ModelOne() 
    } 
    func someFunc() { 
     (self.data).setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1)) 
    } 
} 
0

첫째는 값 유형 (예 : 구조체를) 타입 캐스팅을 적용 할 때 성공하면 다음 요청의 불변 사본를 수신, setSub 기능

if var data = self.data as? ModelOne { 
    data.setSub(ModelOne.SubModelOne(someVar: 2, othervar: 1)) 
} 
+0

@ ShadowOf로 답변을 썼다, 다시 self.data 값을 복사해야합니다 – j0h4nn3s

+0

당신이 할 수있는 self.data = data 내가 코멘트에서 언급 한대로. :) – Sahil

0

@ 그림자가 맞습니다. 불가능한 임시 구조를 돌연변이하려고 시도하고 돌연변이가 이루어지면 대부분 쓸모 없게 만듭니다. 사실 함수의 반환 구조체를 수정하는 것과 비슷한 문제입니다. (여기에 대답을 참조하십시오 : Cannot assign to property: function call returns immutable value)

0

내 경우에는 structclass 개체로 변경하여 오류를 해결할 수있었습니다.

+5

Swift에서 그렇게해서는 안됩니다. – lee

+0

네, 물론 고쳐주세요! 그러나 이것은 현명한 방법이 아닙니다. https://developer.apple.com/videos/play/wwdc2015/408/을 확인하십시오. –