[swift-evolution] Static Subscript
davesweeris at mac.com
davesweeris at mac.com
Thu Jan 28 21:20:01 CST 2016
What do we think about allowing types to have static subscripts?
struct Foo {
static subscript(bar: Bar) -> FooBar {...}
}
It could be used to implement umbrella class “initializers” that return subclasses (or anything, really) without relying on Objective-C tomfoolery, since it’s just another function and can return anything you want:
class Int8Class : SwiftInteger {…}
class Int16Class : SwiftInteger { var x: Int16; override init() { self.x = 0 }; init(_ x: Int16) { self.x = x } }
class Int32Class : SwiftInteger {…}
class IntClass : SwiftInteger {…}
class BigIntClass : SwiftInteger {…}
class SwiftInteger {
static subscript() -> SwiftInteger {…}
static subscript(x: Int8) -> SwiftInteger {…}
static subscript(x: Int16) -> SwiftInteger {…}
static subscript(x: Int32) -> SwiftInteger {…}
static subscript(x: Int) -> SwiftInteger {
switch x {
case Int( Int8.min)...Int( Int8.max): return Int8Class(Int8(x))
case Int(Int16.min)...Int(Int16.max): return Int16Class(Int16(x))
case Int(Int32.min)...Int(Int32.max): return Int32Class(Int32(x))
default: return IntClass(x)
}
}
}
let foo = SwiftInteger[256] //foo is a Int16Class
Or for creating “functions” that have properties:
struct add {
static let name: String = "add"
static var logging = false
static private (set) var callCount = 0
static subscript(arg1: Int, arg2: Int) -> Int {
defer {
if add.logging == true {
print("callcount = \(add.callCount): \(add.name)(\(arg1), \(arg2)) -> \(ret)")
}
}
add.callCount += 1
let ret = arg1 + arg2
return ret
}
}
let nine = add[4, 5]
add.logging = true
let ten = add[4, 6] // prints “call count = 2: add(4, 6) -> 10"
Thoughts?
- Dave Sweeris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160128/7d21b574/attachment.html>
More information about the swift-evolution
mailing list