[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