나는 당신의 주된 목표가 어떤 프로토콜에 맞는 객체들의 컬렉션을 유지하고이 컬렉션에 추가하고 삭제하는 것입니다. 이것은 클라이언트 "SomeClass"에 명시된 기능입니다. 동일 상속은 자체를 필요로하며이 기능에는 필요하지 않습니다. 커스텀 비교기를 사용할 수있는 "index"함수를 사용하여 Obj-C의 배열에서이 작업을 수행 할 수 있었지만 Swift에서는 지원되지 않습니다. 따라서 가장 간단한 해결책은 아래 코드와 같이 배열 대신 사전을 사용하는 것입니다. 원하는 프로토콜 배열을 반환하는 getElements ()를 제공했습니다. 따라서 SomeClass를 사용하는 사람은 사전이 구현에 사용되었음을 알지 못합니다.
어쨌든, 당신은 당신의 오브제를 분리하기 위해 구별되는 속성이 필요하기 때문에, 나는 그것이 "이름"이라고 가정했습니다. 새 SomeProtocol 인스턴스를 작성할 때 do element.name = "foo"인지 확인하십시오. 이름을 설정하지 않으면 인스턴스를 만들 수는 있지만 컬렉션에 추가되지 않으며 addElement ()는 "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)
}
}