代码之家  ›  专栏  ›  技术社区  ›  Alex Stone

iOS RxSwift-如何打开“Optional”或“T”??`?

  •  1
  • Alex Stone  · 技术社区  · 6 年前

    我使用下面的逻辑来检查我的主题使用rxblock的状态。我得到了一个奇怪的值 Int?? 由于 try? subject.verifier.toBlocking().first()

    下面的语法让编译器很高兴,但让我的眼睛流血。

    func checkSubjectState() -> Int
        {
          let updatedChecksum = try? subject.verifier.toBlocking().first() ?? 0
          return updatedChecksum ?? 0
        }
    
    let expectedCheckSum = checkSubjectState()
    expect(expectedCheckSum).to(equal(knownValue))
    
    4 回复  |  直到 6 年前
        1
  •  2
  •   Daniel T.    6 年前

    下面的答案不需要您定义任何自己的函数:

    return (try? subject.verifier.toBlocking().first()).flatMap { $0 } ?? 0
    
        2
  •  2
  •   Daniel T.    6 年前

    是的,所以 first() 能扔吗 它返回一个可选类型,所以 try? first() Optional<Optional<Int>> Int?? . 坦白说,我认为 第一() 函数写得不好。它应该 返回可选,而不是两者都返回。

    flattened 操作员:

    public protocol OptionalType {
        associatedtype Wrapped
        var value: Wrapped? { get }
    }
    
    extension Optional: OptionalType {
        public var value: Wrapped? {
            return self
        }
    }
    
    extension Optional where Wrapped: OptionalType {
        var flattened: Wrapped.Wrapped? {
            switch self {
            case let .some(opt):
                return opt.value
            case .none:
                return nil
            }
        }
    }
    

    let expectedCheckSum = (try? subject.verifier.toBlocking().first()).flattened ?? 0
    

    你认为值得还是不值得是你的决定。

        3
  •  2
  •   vadian    6 年前

    还有另外两种方法通过处理错误来避免双重可选

    func checkSubjectState() throws -> Int
    {
      return try subject.verifier.toBlocking().first() ?? 0
    }
    

    第二个增加了 do - catch

    func checkSubjectState() -> Int
    {
        do { return try subject.verifier.toBlocking().first() ?? 0 } 
        catch { return 0 }
    }
    
        4
  •  1
  •   Daniel T.    6 年前

    infix operator ???: NilCoalescingPrecedence
    func ???<T>(opt: T??, val: @autoclosure () -> T) -> T {
        return ((opt ?? val()) ?? val())
    }
    

    return (try? subject.verifier.toBlocking().first()) ??? 0
    

    我试着给运算符一个比 try?

    推荐文章