Named constructors
The primary benefit of the static facotry sample is that each static facotry technique can have a reputation. Apple makes use of this sample of their UIColor
class implementation to create named colours like .crimson
, .yellow
, and many others. Please be aware that the implementation in Swift just isn’t actually a technique, however a static property, which returns the precise occasion.
public extension TimeInterval {
public static var second: TimeInterval { return 1 }
public static var minute: TimeInterval { return 60 }
public static var hour: TimeInterval { return 3_600 }
public static var day: TimeInterval { return 86_400 }
public static var week: TimeInterval { return 604_800 }
}
If it is so laborious to memorize what number of seconds is a day or every week why do not we create a named initializer for it. See? TimeInterval.week
is a lot better than 604_800
. 😅
Native initialization scope
One other benefit of static manufacturing unit strategies that you could restrict the initialization of a category to a non-public scope degree. In different phrases object creation will solely be out there via the static manufacturing unit technique. You simply need to make the init technique personal.
public ultimate class Service {
var identify: String
personal init(identify: String) {
self.identify = identify
}
public static var native: Service {
return Service(identify: "native")
}
public static var distant: Service {
return Service(identify: "distant")
}
}
Observe that you could prohibit subclassing with the ultimate & static key phrase. If you wish to permit subclassing you must take away ultimate
and use the class
key phrase as an alternative of the static
for the properties, this fashion subclasses can override manufacturing unit strategies. 🤔
Statically return something
Static manufacturing unit may also return subtypes of a given object, however why do not we take this even one step additional? You can even return any type of sort from a static technique, I do know this looks like a cheat, as a result of I am not creating an occasion of UIColor
right here, however I consider that it is price to say this technique right here, becuase it is carefully associated to static factories. This method may be actually helpful typically. 😛
extension UIColor {
personal static func picture(with shade: UIColor) -> UIImage {
let rect = CGRect(x: 0, y: 0, width: 1, peak: 1)
UIGraphicsBeginImageContext(rect.measurement)
let context = UIGraphicsGetCurrentContext()!
context.setFillColor(shade.cgColor)
context.fill(rect)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img!
}
static var redImage: UIImage {
return UIColor.picture(with: .crimson)
}
}