EDIT: này hoạt động hoàn toàn tốt trong Swift 3, mà chúng ta nên tất cả được sử dụng bởi bây giờ :)Gõ Swift
Nếu tôi có hai giao thức, X
và Y
nơi Y
thực hiện X
, tại sao sao tôi không thể chỉ định mảng Y
cho biến có loại [X]
?
Thậm chí tò mò hơn, tôi có thể chuyển đổi từng cái một thành một mảng X và biên dịch tốt.
protocol X { }
protocol Y: X { }
// Make a test array of Y
extension String: Y { }
let a: [Y] = [ "Hello" ]
// Make it into an array of X - this works absolutely fine
let b: [X] = [ a[0] as X ]
// Why won't this cast work?
let c: [X] = a as [X]
Tôi nghĩ rằng cho Y không tất cả mọi thứ X có thể làm, nhiệm vụ này nên được tốt (yea, tôi mất một số loại thông tin, nhưng nó ít nhất nên biên dịch!)
Bất kỳ ý tưởng?
EDIT: current answer chỉ ra rằng đó là điều nguy hiểm nếu bạn sử dụng mảng có thể thay đổi - mà tôi không nhận được nhưng bây giờ :) Tuy nhiên, nếu mảng của tôi là tất cả bất biến tại sao Swift sẽ không để điều này xảy ra? Ngay cả khi c
là một mảng có thể thay đổi (tức là var c = a as [X]
) tại sao Swift sẽ không sao chép nó, để lại a
nguyên vẹn?
Generics nhanh là bất biến. Không chắc chắn bạn có thể có generics covariant nhanh chóng. –
Vấn đề với mã này là, bạn có thể thêm một 'Z' vào phân cấp cũng xuất phát từ X. Bây giờ Mảng của bạn có cả' Y' và 'Z', mặc dù' Z' không phải là một kiểu con của 'Y '. –
@LukaJacobowitz: Tôi không nghĩ đây là vấn đề. Infact bạn vẫn có thể nối thêm các kiểu khác nhau phù hợp với 'Y'. Ví dụ. 'struct Z: X {}; b.append (Z())'. Bây giờ 'b' không chứa một phần tử của kiểu' String' và một phần tử của kiểu 'Z'. Và trình biên dịch là tốt với điều đó. –