2016-03-25 2 views
2

Я пытаюсь создать расширение для типа массива, чтобы иметь возможность работать с 2D-массивами. Фактически, я сделал это в Objective-C, а код ниже работал как шарм. Но я действительно застрял в Свифте.Быстрая ошибка расширения двумерного массива

extension Array { 
mutating func addObject(anObject : AnyObject, toSubarrayAtIndex idx : Int) { 
    while self.count <= idx { 
     let newSubArray = [AnyObject]() 
     self.append(newSubArray) 
    } 

    var subArray = self[idx] as! [AnyObject] 
    subArray.append(anObject) 
} 

func objectAtIndexPath(indexPath : NSIndexPath) -> AnyObject { 
    let subArray = self[indexPath.section] as! Array 
    return subArray[indexPath.row] as! AnyObject 
} 

}

я получаю ошибку я не упоминалось в образце кода независимо от того, что я делаю. Буду признателен за любую помощь. Благодарю.

UPDATE благодаря римским Sausarnes

Правильный код это:

extension Array where Element: _ArrayType, Element.Generator.Element: AnyObject { 
mutating func addObject(anObject : Element.Generator.Element, toSubarrayAtIndex idx : Int) { 
    while self.count <= idx { 
     let newSubArray = Element() 
     self.append(newSubArray) // ERROR: Cannot invoke 'append' with an argument list of type '([AnyObject])' 
    } 

    self[idx].append(anObject) 
} 

func objectAtIndexPath(indexPath: NSIndexPath) -> AnyObject { 
    let subArray = self[indexPath.indexAtPosition(0)] 
    return subArray[indexPath.indexAtPosition(1)] as Element.Generator.Element 
} 

}

ответ

5

@ ответ Бримстоуна близко, но если я правильно понимаю ваш вопрос, это массив [AnyObject], что означает, что он должен выглядеть следующим образом:

extension Array where Element: _ArrayType, Element.Generator.Element: AnyObject { 
    mutating func addObject(anObject : Element.Generator.Element, toSubarrayAtIndex idx : Int) { 
     while self.count <= idx { 
      let newSubArray = Element() 
      self.append(newSubArray) // ERROR: Cannot invoke 'append' with an argument list of type '([AnyObject])' 
     } 

     var subArray = self[idx] 
     subArray.append(anObject) 
    } 

    func objectAtIndexPath(indexPath: NSIndexPath) -> AnyObject { 
     let subArray = self[indexPath.indexAtPosition(0)] 
     return subArray[indexPath.indexAtPosition(1)] as Element.Generator.Element 
    } 
} 
+0

Ты блестящий! Это сработало, но я действительно не получил все это _ArrayType и Generator. У меня есть много для чтения, я думаю :) –

+0

На самом деле, есть ошибка, которую я сделал в последних двух строках метода addObject. Последняя строка метода addObject должна выглядеть примерно так: \t \t self [idx] .append (anObject) –

+0

Мне кажется, мне нужна помощь с Swift 3 :) –

0

Вы должны сказать, что тип элемента массива в расширении. Попробуйте это:

extension _ArrayType where Generator.Element == AnyObject { 
    mutating func addObject(anObject: AnyObject, toSubarrayAtIndex idx: Int) { 
     while self.count <= idx { 
      let newSubArray = [AnyObject]() 
      self.append(newSubArray) 
     } 

     var subArray = self[idx] as! [AnyObject] 
     subArray.append(anObject) 
    } 

    func objectAtIndexPath(indexPath: NSIndexPath) -> AnyObject { 
     let subArray = self[indexPath.section] as! Array 
     return subArray[indexPath.row] as! AnyObject 
    } 
} 

От this question

Смежные вопросы