Hi All. I’m trying to write a utility method that is kind of the opposite of “x ?? y”, which means “x != nil ? x : y”. I want “x != nil ? f(x) : nil” This is not difficult to write, but if you have "f(x)->z" and "g(x)->z?", I seem to need two versions of the function in order to handle it. Is there any way to do this with only one function?
public func fnil<XType,RetType> ( _ x:XType?, _ f:(XType)->RetType ) -> RetType? { if let x = x { return f(x) } else { return nil } } public func fnil<XType,RetType> ( _ x:XType?, _ g:(XType)->RetType? ) -> RetType? { if let x = x { return g(x) } else { return nil } } private func f(_ x:Int) -> Int { return x } private func g(_ x:Int) -> Int? { if x == 5 { return nil } else { return x } } func testFnil() { XCTAssertNil(fnil(nil, {f($0)})) XCTAssertEqual(7, fnil(7,{f($0)})) XCTAssertNil(fnil(nil, {g($0)})) XCTAssertEqual(7, fnil(7, {g($0)})) XCTAssertNil(fnil(5, {g($0)})) } Thanks! -Kenny
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users