@@ -549,3 +549,67 @@ extension ChangeType where T == String? {
549
549
var foo : String ? { return self . delta? . previous as? String } // OK
550
550
var bar : String ? { self . delta? . next }
551
551
}
552
+
553
+ // SR-15038
554
+ protocol ExperimentDeserializable {
555
+ static func deserializeExperiment( _ value: Any ) -> Self ?
556
+ }
557
+
558
+ extension String : ExperimentDeserializable {
559
+ static func deserializeExperiment( _ value: Any ) -> String ? { value as? String }
560
+ }
561
+
562
+ extension Int : ExperimentDeserializable {
563
+ static func deserializeExperiment( _ value: Any ) -> Int ? { value as? Int }
564
+ }
565
+
566
+ class Constant < T> {
567
+ private init ( getUnderlyingValue: @escaping ( ) -> T ) {
568
+ print ( getUnderlyingValue ( ) )
569
+ }
570
+ }
571
+
572
+ struct Thing {
573
+ let storage : [ String : Any ]
574
+ }
575
+
576
+ extension Constant where T: Sequence , T. Element: ExperimentDeserializable {
577
+ static func foo< U> ( thing: Thing , defaultValue: T ) -> T where T == [ U ] {
578
+ guard let array = thing. storage [ " foo " ] as? [ Any ] else {
579
+ fatalError ( )
580
+ }
581
+
582
+ let value = array. map ( T . Element. deserializeExperiment) as? [ T . Element ] ?? defaultValue // OK
583
+ return value
584
+ }
585
+ }
586
+
587
+ // Array
588
+ func decodeStringOrInt< T: FixedWidthInteger > ( ) -> [ T ] {
589
+ let stringWrapped = [ String] ( )
590
+ if let values = stringWrapped. map ( { $0. isEmpty ? 0 : T ( $0) } ) as? [ T ] { // OK
591
+ return values
592
+ } else {
593
+ fatalError ( )
594
+ }
595
+ }
596
+
597
+ // Set
598
+ func decodeStringOrIntSet< T: FixedWidthInteger > ( ) -> Set < T > {
599
+ let stringWrapped = [ String] ( )
600
+ if let values = Set ( stringWrapped. map ( { $0. isEmpty ? 0 : T ( $0) } ) ) as? Set < T > { // OK
601
+ return values
602
+ } else {
603
+ fatalError ( )
604
+ }
605
+ }
606
+
607
+ // Dictionary
608
+ func decodeStringOrIntDictionary< T: FixedWidthInteger > ( ) -> [ Int : T ] {
609
+ let stringWrapped = [ String] ( )
610
+ if let values = Dictionary ( uniqueKeysWithValues: stringWrapped. map ( { $0. isEmpty ? ( 0 , 0 ) : ( 0 , T ( $0) ) } ) ) as? [ Int : T ] { // OK
611
+ return values
612
+ } else {
613
+ fatalError ( )
614
+ }
615
+ }
0 commit comments