Skip to content

Xcode 14.3ビルドエラー: Yogaブール値ビット演算子問題

問題

Xcode 14.3へのアップデート後、React Nativeプロジェクトのビルドが以下のエラーで失敗します:

Use of bitwise '|' with boolean operands

このエラーはReact NativeのレイアウトエンジンであるYogaのソースコード内で発生します。典型的な状況:

  • クリーンビルド、キャッシュ削除、DerivedData削除でも解決しない
  • node_modulesios/Pods削除後再インストールしても同エラーが継続
  • Yoga関連ファイル(Yoga.cppなど)で発生

この問題は C++の型安全性強化 が原因です。Xcode 14.3ではブール値(bool)に対するビット演算子(|)の使用が厳格にチェックされるようになりました。

根本原因

以下のYogaソースコードが問題の核心です(簡略化例):

cpp
// 問題のあるコード例
bool A = ...;
bool B = ...;
bool result = A | B; // ビット演算子でboolを操作

ビット演算子(|) は本来:

  • 整数型(int, charなど)に対して使用
  • ビット単位のOR演算を行う

ブール値(bool)では

  • 論理演算(||)を使用するのが正しい
  • 型チェックが厳格化され「不適切なビット演算」と判定される

Yogaでの該当箇所:

cpp
// yoga/Yoga.cpp
bool hasOverflow = ...;
return hasOverflow | size.isDefined();

一時的な修正方法(手動編集)

エラー発生ファイルを直接修正:

  1. Xcodeでエラー発生ファイルを開く
    (例: react-native/ReactCommon/yoga/yoga/Yoga.cpp

  2. ビット演算子を論理演算子に置換:

    diff
    - bool value = someBool | anotherBool;
    + bool value = someBool || anotherBool;

適用箇所の具体例:

cpp
// 修正前(問題のある行)
hasOverflow | size.isDefined()

// 修正後(正しい記法)
hasOverflow || size.isDefefined()

WARNING

この方法の限界:

  • yarn installnpm install実行毎に変更が上書きされる
  • チーム開発時に全員が同じ修正を適用する必要あり
  • 恒久的な解決策ではない

恒久的な解決方法(patch-package適用)

依存パッケージを永続的に修正するにはpatch-packageが最適です。

Step 1: パッケージインストール

bash
# patch-packageのインストール
yarn add postinstall-postinstall patch-package --dev
# or
npm install patch-package postinstall-postinstall --save-dev

Step 2: package.json設定修正

package.jsonにポストインストールスクリプトを追加:

json
// package.json
"scripts": {
    "postinstall": "patch-package"
}

Step 3: ソースコード修正

node_modules内の該当ファイルを編集:
パス(例):node_modules/react-native/ReactCommon/yoga/yoga/Yoga.cpp

cpp
if (child->style.positionType() == YGPositionTypeStatic) {
    // ...
    const bool shouldAddChildTrailingMargin = 
        childTrailingMargin && rowMetrics.margin[trailingEdge] != 0;
    rowMetrics.margin[trailingEdge] +=
        shouldAddChildTrailingMargin ? childTrailingMargin : 0;
}
cpp
if (child->style.positionType() == YGPositionTypeStatic) {
    // ...
    const bool shouldAddChildTrailingMargin = 
        childTrailingMargin || rowMetrics.margin[trailingEdge] != 0;
    rowMetrics.margin[trailingEdge] +=
        shouldAddChildTrailingMargin ? childTrailingMargin : 0;
}

Step 4: パッチファイル作成

bash
npx patch-package react-native

パッチファイルが生成:
/patches/react-native+[version].patch`

Step 5: 変更をコミット

bash
git add patches/
git commit -m "fix: Apply Yoga Xcode 14.3 build patch"

動作確認

初回適用時は以下を実行:

bash
rm -rf node_modules
yarn install # または npm install

パッチが自動適用されることを確認

根本的な解決策(Yogaバージョンアップ)

問題は Yoga v1.19.0以上で公式修正済み です:

バージョンアップ方法:

  1. React Nativeのバージョンを確認
    (YogaはReact Nativeにバンドル)

  2. サポートされているReact Nativeへアップグレード
    v0.70+ では問題修正済み

bash
npx react-native upgrade

注意点

大規模なプロジェクトでは:

  • React Nativeアップグレードに互換性問題が発生する可能性
  • テスト計画を十分に実施してからアップグレードを実行
  • バージョンアップが困難な場合はpatch-packageが現実解

代替手法(C++フラグ変更)

プロジェクト設定でコンパイラチェックを緩和:

cpp
// Podfile
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      # C++コンパイラフラグ追加
      config.build_settings['GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS'] = 'NO'
    end
  end
end

非推奨

  • エラーチェック機能を無効化する危険性あり
  • 他の潜在的バグを見逃す可能性
  • 最終手段としてのみ使用

まとめ

方法持続性推奨度難易度
手動コード修正低(再インストールで消える)
patch-package適用高(バージョン管理可能)
Yogaバージョンアップ永続的
コンパイラフラグ変更永続的(リスクあり)×

プロダクション環境では

  1. React Nativeを最新安定版へアップグレードするのが最良
  2. 即時対応が必要ならpatch-packageが現実的ソリューション
  3. コンパイラ設定変更は一時的回避策としてのみ使用

Xcodeの静的解析強化に伴い、類似の型チェックエラーが発生する可能性があります。コードの静的解析を定期的に実施し、潜在的な型関連の問題を早期に検出することが重要です。