代码之家  ›  专栏  ›  技术社区  ›  EvGeniy Ilyin

颤栗:价值的知识!=无效的

  •  0
  • EvGeniy Ilyin  · 技术社区  · 3 年前

    如果我这样写代码,编译器知道什么 value 不是空的

    // IT WORKS GOOD
    int? value = getIntOrNull();
    if (value != null) {
       // now compiler know what value is not null
       int strongInt = value;
    } else {
       AssertionError('value should be not null');
    }
    

    但我怎么能像一个 guard 在里面 swift ? 我试着通过 assert ,但在本例中,编译器不知道是什么 价值 不是空的。

    // IT DOESN'T WORK
    int? value = getIntOrNull();
    assert(
      value != null,
      'value should be not null',
    );
    
    // now compiler does not know what value is not null 
    // how I can do the same behaviour like in `if`
    int strongInt = value; // error: request `value!`
    
    0 回复  |  直到 3 年前
        1
  •  3
  •   lrn    3 年前

    断言不会在生产模式下执行,因此 assert 不受断言测试的保护。有可能到达 int strongInt = value; 具有 value 存在 null (通过不执行断言),因此程序不可用 声音 . 编译器仅在以下情况下升级 全部的 使用路径要经过测试,以确保升级的类型。

    所以,一个 assert(test) 不会比

    if (assertsEnabled && !(test)) throw AssertionError();
    

    哪里 assertsEnabled 在编译时是未知的。