Tôi có giao thức, Address
, được kế thừa từ giao thức khác, Validator
và Address
đáp ứng yêu cầu Validator
trong tiện ích.Không thể sử dụng giao thức làm loại liên kết trong giao thức khác trong Swift
Có một giao thức khác, FromRepresentable
, có yêu cầu associatedType
(ValueWrapper
) cần phải là Validator
.
Bây giờ, nếu tôi cố gắng sử dụng Address
làm associatedType
, thì nó sẽ không biên dịch. Nó nói,
Loại được hỏi 'Địa chỉ' (theo yêu cầu 'giá trịForDetail') là không hợp lệ: không phù hợp với 'Trình xác thực'.
Việc sử dụng này có hợp pháp không? Chúng ta không thể sử dụng Address
thay cho Validator
, vì tất cả Addresses
là Validator
.
Dưới đây là đoạn mã tôi đang cố gắng.
enum ValidationResult {
case Success
case Failure(String)
}
protocol Validator {
func validate() -> ValidationResult
}
//Address inherits Validator
protocol Address: Validator {
var addressLine1: String {get set}
var city: String {get set}
var country: String {get set}
}
////Fulfill Validator protocol requirements in extension
extension Address {
func validate() -> ValidationResult {
if addressLine1.isEmpty {
return .Failure("Address can not be empty")
}
return .Success
}
}
protocol FormRepresentable {
associatedtype ValueWrapper: Validator
func valueForDetail(valueWrapper: ValueWrapper) -> String
}
// Shipping Address conforming to Address protocol.
// It should also implicitly conform to Validator since
// Address inherits from Validator?
struct ShippingAddress: Address {
var addressLine1 = "CA"
var city = "HYD"
var country = "India"
}
// While compiling, it says:
// Inferred type 'Address' (by matching requirement 'valueForDetail') is invalid: does not conform
// to 'Validator'.
// But Address confroms to Validator.
enum AddressFrom: Int, FormRepresentable {
case Address1
case City
case Country
func valueForDetail(valueWrapper: Address) -> String {
switch self {
case .Address1:
return valueWrapper.addressLine1
case .City:
return valueWrapper.city
case .Country:
return valueWrapper.country
}
}
}
Cập nhật: Filed một bug.
Được rồi, tôi hiểu rồi, nhưng có lý do nào để chúng ta phải sử dụng concreteType cho một kiểu liên kết với ràng buộc giao thức không? Trình biên dịch không phát ra bất kỳ lỗi nào nếu chúng ta sử dụng Địa chỉ làm đối số cho một hàm mong đợi Validator. –
Tôi không hiểu tại sao chúng ta phải sử dụng loại cụ thể nếu liên kếtType có ràng buộc giao thức. Liệu nó có liên quan đến hành vi bất biến hay phân bổ bộ nhớ? Bạn có bất kỳ tài liệu tham khảo mà tôi có thể biết thêm thông tin về điều này. –
@VishalSingh Tôi sợ tôi không thể đưa ra bất kỳ lý do nào tốt hơn "bởi vì đó chỉ là cách nó" - tôi chắc chắn không thể nghĩ ra lý do tại sao nó không thể được, nhìn thấy như phiên bản không bị giới hạn hoạt động tốt . Tôi cũng không thể tìm thấy bất cứ điều gì trên danh sách gửi thư tiến hóa nhanh chóng hoặc theo dõi lỗi về điều này. Nó cũng có thể là giá trị nộp một [báo cáo lỗi] (https://bugs.swift.org/secure/Dashboard.jspa) trên, và nhìn thấy những gì họ nói về nó. – Hamish