I think it’s worth thinking about, clarifying, and possibly documenting where inference happens and where it doesn’t.
As mentioned, there are limits to inference. Some of those limits are imposed by design, as in functions (check out F# to have your mind blown by how far type inference goes there). - Type inference of function-local variable declarations is not the topic here. Everybody loves that :-D. - For properties there are some levels to it, depending on the initial value: - [inferred] Literals (String, Int, ...) - [inferred] Constructor call, e.g. `Foo(a, b)` - [inferred] Function call without generics, e.g. `someFunc()` - [inferred] Function call with generics, e.g. `someArray.map(someGenericFunc)` (I believe this triggered the discussion, as it can cause performance issues) - [NOT inferred] Function call with AMBIGUOUS types (impossible to infer) - [NOT inferred] Closure, e.g. `{ /* do some stuff */ return /* some initial value */ }()` - Computed properties, where currently the type is NOT inferred - I’m unsure about how global properties are implemented, but I think the inference behaviour is the same there. _______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution