public protocol Reporter { func report() -> String } public class Subject { public var value = 1 public init(_ v: Int) { value = v } } public var s2 = Subject(2) public var s3 = Subject(3) public var s4 = Subject(4) public var s5 = Subject(5) public struct Container : Reporter { #if BEFORE var v : Subject #else weak var v : Subject? #endif public init(_ s: Subject) { v = s } public func report() -> String{ #if BEFORE return "Container(\(v.value))" #else return "Container(\(v!.value))" #endif } } public func createContainerReporter() -> Reporter { return Container(s2) } public struct PairContainer: Reporter { public var pair : (Container, Container) public init(_ p : (Container, Container)) { pair = p } public func report() -> String { return "PairContainer(\(pair.0.report()), \(pair.1.report()))" } } public func createPairContainerReporter() -> Reporter { return PairContainer((Container(s3), Container(s4))) } public enum EnumContainer : Reporter { case Empty case Some(Container) public func report() -> String { switch self { case .Empty: return "EnumContainer Empty" case .Some(let c): return "EnumContainer(\(c.report()))" } } } public func createEnumContainerReporter() -> Reporter { return EnumContainer.Some(Container(s5)) } public func report(_ r: Reporter) -> String { return r.report() }