Calling a Swift class factory method with leading dot notation?

Looks like the rule is: if a type has a static method that returns that type, you can skip the type’s name if the return type is already determined:

struct S {
    static func staticmethod() -> S {
        return S()
    }
    static var staticproperty: S {
        return S()
    }
}

let s1: S = .staticmethod()
let s2: S = .staticproperty

I wonder if this is intentional, or a side-effect of the implementation of Enums which, given this feature, could maybe be thought of as syntactic sugar for something like this:

struct FakeEnum {
    let raw: Int
    static var FirstCase:  FakeEnum  { return FakeEnum(raw: 0) }
    static var SecondCase: FakeEnum  { return FakeEnum(raw: 1) }
}

let e: FakeEnum = .FirstCase

This feature is called "Implicit Member Expression"

An implicit member expression is an abbreviated way to access a member of a type, such as an enumeration case or a class method, in a context where type inference can determine the implied type. It has the following form:

.member name


But, as of right now, I advise you should not use this feature in Optional or ImplicitlyUnwrappedOptional context.

Although this works:

// store in Optional variable
let col: UIColor?
col = .redColor()

// pass to function
func f(arg:UIColor?) { println(arg) }
f(.redColor())

This crashes the compiler :(

func f(arg:UIColor?, arg2:Int) { println(arg) }
//                 ^^^^^^^^^^ just added this.
f(.redColor(), 1)

The compiler has some bugs. see: does swift not allow initialization in function parameters?

Tags:

Swift