Подтвердить что ты не робот

Ограничение с классами, полученными из родовых классов в быстрых

Я пытаюсь получить свой класс из родового класса:

class foo<T> {}
class bar : foo<Int> {}

Но этот код не скомпилирован с ошибкой en:

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

Как избежать этого ограничения? Возможно ли это?

4b9b3361

Ответ 1

Ssreg,

К сожалению, это официальный:

Вы можете подклассифицировать общий класс, но подкласс также должен быть общий класс.

Будем надеяться, что Apple исправит это в будущей версии.

Между тем, рассмотрим это как возможность использовать aggregation вместо подкласса.

Примечание:

В качестве плохой версии решения можно использовать typealias:

class foo<T> {}
class bar<Int> : foo<Int> {}
typealias Bar = bar<Int>

Таким образом, остальная часть кода может быть написана так же, как если бы Apple уже исправила вопрос.

Ответ 2

Альтернативой typealias решению является буквально взять документацию:

Вы можете подклассифицировать общий класс, но подкласс также должен быть общий класс.

Итак, мы делаем подкласс общим классом, но другого типа, который мы ничем не используем.

class foo<T> {

    func doSomething(t:T) -> T {
        return t;
    }
}

class bar<S> : foo<Int> {

    override func doSomething(t:Int) -> Int {
        return t * t;
    }
}

let b : bar = bar<AnyObject>()
b.doSomething(5) // 25 instead of 5

Я предпочитаю использовать этот подход при использовании typealias, потому что он не загрязняет пространство имен дополнительным типом. Это имеет особое значение, если подкласс (bar) означает public или internal.

Edit

В документации больше не содержится фраза об ограничении общих подклассов. Надеюсь, это означает, что Apple планирует изменить это раньше, чем позже.

Ответ 3

В Swift 2 можно подклассифицировать общий класс:

class Something {}

class Base<T> {}

class Fancy : Base<Something> {}

Ответ 4

У меня была такая же проблема, и я нашел решение!

class SomeType {
}
class Foo<T> {
}
class Bar<T: SomeType>: Foo<T> {
}

Теперь вы можете сделать:

let bar = Bar()

Это будет тип по умолчанию для типа SomeType. Единственным недостатком является то, что вы можете сделать это только для типов подкласса. Поэтому для Int это не сработает.