Использование необъявленного типа «T» при объявлении массива любого типа в Swift

Я пытаюсь объявить свойство с массивом любого типа T. Но я получаю ошибку компилятора — Использование необъявленного типа «T». Ниже приведен класс, который я создал с двумя свойствами.

class Product {
 var productName: String;
 var items: Array<T>
}

Пожалуйста, дайте мне знать, как объявить массив любого типа, используя Generics в Swift. Я пробовал следующие варианты:

{
var items: Array<T>;
var items = Array<T>();
var items = [T]();
}

person user3187840    schedule 01.09.2014    source источник


Ответы (2)


Вы должны определить универсальный тип в объявлении класса:

class Product<T> {
    var productName: String;
    var items: Array<T>
}

Конечно, поскольку класс имеет неинициализированные необязательные переменные, вы должны либо инициализировать их встроенными:

class Product<T> {
    var productName: String = ""
    var items: Array<T> = Array<T>()
}

сделайте их необязательными:

class Product<T> {
    var productName: String?
    var items: Array<T>?
}

определить инициализатор:

class Product<T> {
    var productName: String
    var items: Array<T>

    init(productName: String, items: Array<T>) {
        self.productName = productName
        self.items = items
    }
}

или любая их комбинация.

Обратите внимание, что точка с запятой в конце не требуется в swift, если вы не поместите более одного оператора в одну строку.

person Antonio    schedule 01.09.2014
comment
Как бы мы сделали эквивалент для функций расширения? - person Pkmmte; 22.12.2017

Я обращаюсь к ошибке в целом.

Я получал следующие ошибки по другой причине.

Ошибка1

не может специализироваться на неуниверсальном типе «Человек»

Ошибка2

использование необъявленного типа 'T'

за совершение немного другой ошибки:

protocol Person{
    associatedtype language
    func write(_ language: language)
    func read(_ language: language)
}

Я соответствовал этому так:

struct American: Person<T>{
    func read(_ language: T) {

    }
    func write(_ language: T) {

    }
}

Но вместо этого мне нужно было соответствовать вот так.

struct American<T> : Person{
    func read(_ language: T) {

    }
    func write(_ language: T) {

    }
}
person Honey    schedule 11.10.2018