#!/usr/local/bin/swift enum NestedArray { case V(Element) case A([NestedArray]) } var na:NestedArray = .A([ .V(0), .V(1), .A([.V(2), .V(3)]) ]) extension NestedArray { var value:Element? { switch self { case let .V(v): return v default: return nil } } var array:[NestedArray]? { switch self { case let .A(a): return a default: return nil } } } extension NestedArray { subscript(i:Int)->NestedArray? { get { switch self { case let .A(a): return a[i] default: return nil } } set { switch self { case var .A(a): a[i] = newValue! self = .A(a) default: return } } } } print(na[0]?.value)