Tôi cho rằng mục đích chính của bạn là giữ một bộ sưu tập các đối tượng tuân theo một số giao thức, thêm vào bộ sưu tập này và xóa khỏi nó. Đây là chức năng như đã nêu trong ứng dụng khách của bạn, "Một số kính". Kế thừa tương đương đòi hỏi bản thân và điều đó là không cần thiết cho chức năng này. Chúng tôi có thể thực hiện công việc này trong các mảng trong Obj-C bằng cách sử dụng chức năng "index" có thể lấy một bộ so sánh tùy chỉnh nhưng điều này không được hỗ trợ trong Swift. Vì vậy, giải pháp đơn giản nhất là sử dụng từ điển thay vì một mảng như trong đoạn mã dưới đây. Tôi đã cung cấp getElements () sẽ cung cấp cho bạn mảng giao thức bạn muốn. Vì vậy, bất cứ ai sử dụng someClass thậm chí sẽ không biết rằng một từ điển đã được sử dụng để thực hiện.
Vì trong mọi trường hợp, bạn sẽ cần một số thuộc tính riêng biệt để phân tách các chướng ngại vật của mình, tôi đã cho rằng đó là "tên". Vui lòng đảm bảo rằng phần tử do.name = "foo" của bạn khi bạn tạo một phiên bản someProtocol mới. Nếu tên không được đặt, bạn vẫn có thể tạo cá thể, nhưng nó sẽ không được thêm vào bộ sưu tập và addEuity () sẽ trả về "false".
protocol SomeProtocol {
var name:String? {get set} // Since elements need to distinguished,
//we will assume it is by name in this example.
func bla()
}
class SomeClass {
//var protocols = [SomeProtocol]() //find is not supported in 2.0, indexOf if
// There is an Obj-C function index, that find element using custom comparator such as the one below, not available in Swift
/*
static func compareProtocols(one:SomeProtocol, toTheOther:SomeProtocol)->Bool {
if (one.name == nil) {return false}
if(toTheOther.name == nil) {return false}
if(one.name == toTheOther.name!) {return true}
return false
}
*/
//The best choice here is to use dictionary
var protocols = [String:SomeProtocol]()
func addElement(element: SomeProtocol) -> Bool {
//self.protocols.append(element)
if let index = element.name {
protocols[index] = element
return true
}
return false
}
func removeElement(element: SomeProtocol) {
//if let index = find(self.protocols, element) { // find not suported in Swift 2.0
if let index = element.name {
protocols.removeValueForKey(index)
}
}
func getElements() -> [SomeProtocol] {
return Array(protocols.values)
}
}