2016-01-04 11 views
0

Я использую шаблонный проект, чтобы попытаться создать новое приложение. Когда я запускаю проект шаблона, я получаю сообщение об ошибке: «[T] не имеет члена с именем« indexOf ».Что должен содержать мой массив + RemoveObject.Swift?

Существующий код в массиве + RemoveObject.swift документ является:

import Foundation 
public func removeObject<T: Equatable>(object: T, inout fromArray array: [T]) 
{ let index = array.indexOf(object) 
    if let index = index { 
     array.removeAtIndex(index) 
    } 
} 

ли проблема использования IndexOf? Странно то, что, когда я пытался использовать решение того, кто ответил на аналогичный вопрос, у меня было около 100 ошибок из структуры связей.

ответ

1

Вы отлично работаете со мной (Swift 2.1.1, Xcode 7.2). Кажется, вы хотите, чтобы эта функция была методом вашего публичного класса. Для минимального рабочего примера вам необходимо, по крайней мере, обернуть свой метод removeObject() в классе, к которому вы хотите принадлежать. Обратите также внимание на то, что вам не нужно использовать отдельную строку для назначения результата из .indexOf(..) вызова (возможно, nil), но может добавить назначение и nil проверить в одном выражении if let.

public class MyArrayOperations { 

    // ... 

    static public func removeObject<T: Equatable>(object: T, inout fromArray array: [T]) { 
     if let index = array.indexOf(object) { 
      array.removeAtIndex(index) 
     } 
    } 

} 

var arr = ["1", "2","3"] 
MyArrayOperations.removeObject("2", fromArray: &arr) 
print(arr) // ["1", "3"] 

Кроме того, обратите внимание, что вы можете явно указать такое же поведение с помощью двух генериков, в случае, если вы хотите, сам массив, чтобы соответствовать некоторому протоколу. Затем вы используете один отдельный тип для типа массива и один для его элементов, после чего указывая, что тип элемента должен соответствовать типу массива Generator.Element. Например .:

func removeObject<T: Equatable, U: _ArrayType where U.Generator.Element == T>(object: T, inout fromArray array: U) { 
    if let index = array.indexOf(object) { 
     array.removeAtIndex(index) 
    } 
} 

При таком подходе можно добавить дополнительный протокол по типу ограничения для массива родового U в сигнатуре функции выше, например,

func removeObject<T: Equatable, U: protocol<_ArrayType, MyProtocol> where U.Generator.Element == T>(object: T, inout fromArray array: [T]) { ... 

Это может быть особенно полезно, когда «имитации» общие Array расширения, который соответствует некоторому протоколу. См. следующее для такого примера:

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