2014-09-05 16 views
8

Ai đó có thể giải thích lỗi này và tại sao điều này làm việc với việc đóng cửa?Không áp dụng một phần phương thức giao thức một phần

Nếu bạn thay đổi 'Kiểm tra' thành 'A' bên trong 'B', mọi thứ hoạt động trong cả hai trường hợp.

beta 7

protocol Test { 
    func someFunc() -> String 
    var someClosure:() -> Int { get } 
} 

class A: Test { 
    func someFunc() -> String { 
     return "A String" 
    } 

    var someClosure:() -> Int { 
     return { 
      return 2 
     } 
    } 
} 

class B { 
    let a: Test 
    let aString:() -> String 
    let aInt:() -> Int 

    init(a: Test){ 
     self.a = a 

     aString = a.someFunc // Error: Partial application of protocol method is not allowed 
     aInt = a.someClosure // Works fine 
    } 
} 

CẬP NHẬT

Ngoài ra ở đây là bộ sưu tập lỗi segmentation lạ của tôi https://gist.github.com/aleksgapp/795a2d428008bdfa4823

Đừng ngần ngại nhận xét nếu bạn có một vài suy nghĩ về bất kỳ.

+0

Vì Xcode7 beta 2 này đang hoạt động –

Trả lời

3

Vì vậy, tôi không thể nói chuyện với lý do tại sao nó hoạt động như thế này, nhưng tôi đã tìm thấy giải pháp thay thế. Hãy thử điều này:

aString = { return a.someFunc() } 
+0

Đã làm việc cho tôi! Tuyệt vời. – DudeOnRock

7

CẬP NHẬT (nhờ Laszlo Korte)

Từ Xcode 7 Beta 2 với Swift 2.0 Ghi chú Phát hành: phương pháp không đột biến của cấu trúc, sự đếm, và các giao thức có thể bây giờ được áp dụng một phần cho thông số "tự" của họ.

Ví dụ:

let a: Set<Int> = [1, 2] 
let b: [Set<Int>] = [[1], [3]] 

b.map(a.union) // [[1, 2], [1, 2, 3]] 

ORIGINAL ĐÁP (chính xác cho Xcode 6 với Swift 1,2)

Nghị định thư có thể được chấp nhận bởi lớp, cấu trúc hoặc liệt kê. Trong hai trường hợp cuối cùng, không cho phép áp dụng một phần cấu trúc hoặc phương pháp liệt kê và bạn nhận được "Không áp dụng một phần phương thức giao thức một phần" vì a: Test có thể là cấu trúc hoặc điều tra.

Phương pháp hoặc hàm được áp dụng một phần là nói cách khác là curried method or function. Vì vậy, khi bạn viết a.someFunc, bạn cố gắng áp dụng một phần phương pháp này, tức là tham chiếu đến việc đóng tài khoản giữ ngầm tham chiếu đến a. Nhưng cấu trúc và liệt kê không phải là loại tham chiếu, chúng là các loại giá trị và không có tham chiếu đến a.

+0

Cảm ơn lời giải thích tuyệt vời. Tôi nghĩ rằng đó là buồn mặc dù. –

+1

Với Xcode7 beta 2, điều này đã được thay đổi để hoạt động ngay bây giờ: "Các phương pháp không biến đổi của cấu trúc, enums và giao thức có thể được áp dụng một phần cho tham số" tự " của chúng." –

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