2015-09-20 3 views
1

Я быстрый новичок. Я создал новый метод в структуре данных Set для моего кода. Этот метод вставляется в набор только в том случае, если значение не равно определенному числу.Расширение набора данных в swift

extension Set { 
    mutating func addExcludingCurrent(value: Int, currIndex: Int) { 
     if value == currIndex { 
      return 
     } else { 
      self.insert(value) // Error 
     } 
    } 
} 

Cannot invoke 'insert' with an argument list of type '(Int)'. Как его решить. Или еще есть лучший способ выполнить эту задачу?

+0

Don ' t используйте расширение, это не общая функциональность, которую нужно добавить в 'Set'. Просто используйте метод. – zaph

ответ

4

A Set является struct, чье AssociatedType определено как Element. Таким образом, вы можете расширить его, включив элементы, а не целые числа:

extension Set { 
    mutating func addExcludingCurrent(value: Element, currIndex: Element) { 
    if value == currIndex { 
     return 
    } else { 
     self.insert(value) 
    } 
    } 
} 

var a = Set<Int>(); 
a.insert(3) 
a.addExcludingCurrent(5,currIndex: 5) 
0

Попробуйте это:

extension Set { 
    mutating func addExcludingCurrent(value: Element, currIndex: SetIndex<Element>) { 
     if value == currIndex { 
      return 
     } else { 
      self.insert(value) // No more mistakes 
     } 
    } 
} 

В Swift Index определяется следующим образом:

public typealias Index = SetIndex<Element> 

Таким образом, вы могли бы написать расширение например:

extension Set { 
    mutating func addExcludingCurrent(value: Element, currIndex: Index) { 
     if value == currIndex { 
      return 
     } else { 
      self.insert(value) // No more mistakes 
     } 
    } 
} 
Смежные вопросы