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

Можно ли задать тип по умолчанию для типа T в Swift?

У меня есть общий класс, который я хочу использовать с типом по умолчанию. Прямо сейчас я могу инициализировать его любым типом, но я должен быть явным.

//Initialize with a type
MyManager<MyCustomerObject>()

// Initialize with NSObject (what I want to be my default type)
MyManager<NSObject>()

// This doesn't work, but I want this kind of functionality
class MyManager<T = NSObject> {}

// So I can create my manager like so and it inserts the default type as NSObject
MyManager() //Or MyManager<>()

Возможно ли это в Swift?

4b9b3361

Ответ 1

Нет, это невозможно сейчас, хотя это часть манифеста Generics, поэтому может быть что-то, что команда Swift рассмотрит для будущей версии языка.

Общие аргументы по умолчанию

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

public final class Promise<Value, Reason=Error> { ... }

func getRandomPromise() -> Promise<Int, Error> { ... }

var p1: Promise<Int> = ... 
var p2: Promise<Int, Error> = p1     // okay: p1 and p2 have the same type Promise<Int, Error>
var p3: Promise = getRandomPromise() // p3 has type Promise<Int, Error> due to type inference
Тем не менее, несколько неудовлетворительным компромиссом было бы использование typealias :
class MyManager<T> {}

typealias MyManagerDefault = MyManager<NSObject>

let defaultManager = MyManagerDefault()

Не так легко, как просто сказать MyManager(), но он отображается рядом с MyManager в автозаполнении, что довольно удобно.