One of my longstanding frustrations with generic types and protocols has been 
how hard it is to work with them when their type is unspecified.
Often I find myself wishing that I could write a function that takes a generic 
type or protocol as a parameter, but doesn’t care what its generic type is.

For example, if I have a type:

struct Foo<T> {
    let name: String
    let value: T
}

or:

protocol Foo {
    associatedtype T
    var name: String { get }
    var value: T { get }
}

And I want to write a function that only cares about Foo.name, I’d like to be 
able to:

func sayHi(to foo: Foo) {
    print("hi \(foo.name)")
}

But instead I get the error, “Reference to generic type Foo requires arguments 
in <…>”

Also, when you want to have a polymorphic array of generic types, you can’t:

let foos: [Foo] = [Foo(name: "Int", value: 2), Foo(name: "Double", value: 2.0)]

And if you remove the explicit type coercion, you just get [Any]

let foos = [Foo(name: "Int", value: 2), Foo(name: "Double", value: 2.0)]

I wish that could be inferred to be [Foo]. I’d like to propose being able to 
use the non-generic interface of a type normally. 
I.e. if you have a type Foo<T>, it is implicitly of type Foo as well. The type 
Foo could be used like any other type.
It could be a parameter in a function, a variable, or even the generic type of 
another type (like a Dictionary<String, Foo>)

The only restriction is that if you want to call or access, directly or 
indirectly, a function or member that requires the generic type,
the generic type would have to be known at that point.

Foo<T> should be able to be implicitly casted to Foo wherever you want, and Foo 
could be cast to Foo<T> conditionally.
Initializers would still obviously have to know the generic type, but given the 
above example, you should be able to:

let names = foos.map { $0.name }

However, you could not do the following:

let foos = [Foo]()

Because the initializer would need to know the generic type in order to 
allocate the memory.

Let me know what you think!

—

Logan Shire
iOS @ Lyft

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to