2015-10-13 13 views
44

Không chắc chắn những gì đang xảy ra ở đây, điều này có vẻ như nó nên được khá thẳng về phía trước. Mọi thứ đang diễn ra trong testClass.testFunc, khi tôi thử và sử dụng mtkAnimQueAppend được khai báo trong tiện ích, tôi nhận được lỗi này: "Không thể sử dụng thành viên đột biến trên giá trị không thể thay đổi: ' 'là bất biến.Swift 2 Lỗi khi sử dụng chức năng ngắt trong phần mở rộng Giao thức "Không thể sử dụng biến đổi thành viên trên giá trị bất biến: 'tự' là bất biến

protocol MTKAnimateValueDelegate { 
    var mtkAnimQue:[MTKAnimateValue]? {get set} 
} 

extension MTKAnimateValueDelegate { 
    ///Adds element to que 
    mutating func mtkAnimQueAppend(element:MTKAnimateValue) { 

     if mtkAnimQue != nil { 
      mtkAnimQue?.append(element) 
     } else { 
      mtkAnimQue = [element] 
     } 
    } 
} 

class testClass: MTKAnimateValueDelegate { 

    var mtkAnimQue:[MTKAnimateValue]? 

    func testFunc() { 
    var animValue = MTKAnimateValue(fromValue: 10, toValue: 20, inSeconds: 2) 
    animValue.isAnimating = true 
    mtkAnimQueAppend(animValue) //ERROR: "Cannot use mutating member on immutable value: 'self' is immutable 
    } 

} 
+0

Tôi thấy toàn bộ vấn đề này khá đáng kinh ngạc ở một số cấp độ. Điều đầu tiên bạn muốn làm với Swift, tất nhiên là tạo một mixin hoạt động như thế này, cho các bộ điều khiển xem. Tôi có nghĩa là nó là một ngôn ngữ định hướng giao thức. Và ios "là bộ điều khiển xem". Vì vậy, điều đầu tiên bạn làm là gì? Đối với tôi, nó vượt ra ngoài niềm tin rằng (A) Apple đã không ngăn chặn điều này từ getgo, và (B) vấn đề là rất tối nghĩa. Nên có 10.000 QA về điều này ở khắp mọi nơi! Ah tốt. – Fattie

Trả lời

93

Vấn đề là, trong giao thức bạn đánh dấu các chức năng như đột biến, mà bạn cần phải làm gì nếu bạn muốn sử dụng giao thức trên một cấu trúc. Tuy nhiên, bản thân được chuyển đến testFunc là bất biến (nó là một tham chiếu đến một thể hiện của lớp) và đó là vấp phải trình biên dịch. Điều này sẽ có ý nghĩa nếu testClass thực sự là một cấu trúc và bạn có thể làm cho hàm biến đổi để giải quyết vấn đề.

Tôi có thể thấy hai quanh công việc:

  1. làm cho các lớp giao thức chỉ

    protocol MTKAnimateValueDelegate: class { ... 
    
  2. Hãy TestClass một struct và dấu testFunc như đột biến.

Dù bằng cách nào, tôi nghĩ đây là lỗi cần được báo cáo cho Apple.

+4

Ôi trời ơi. Tôi không bao giờ biết điều này. Tuyệt vời! – devxoul

+4

Tôi muốn một giao thức lớp là điều đầu tiên Xcode đề xuất. Cảm ơn sự giúp đỡ của bạn – Aron

+0

Cảm ơn câu trả lời gọn gàng JeremyP. Tôi đã gửi một tiền thưởng để nói lời cảm ơn. – Fattie

Các vấn đề liên quan