Swiftに移行しようとしているObj-Cプロジェクトがあります。私はさまざまなクラスで成功しましたが、最近では意味をなさない問題に遭遇しました。現在のコードベースをコンパイルしようとすると、次のメッセージが表示されます(SUPER UNHELPFUL ERROR MESSAGE)
コマンド/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftcは、終了コード1で失敗しました
私の唯一の仮定は、何らかの形でブリッジングヘッダーに関連していることですが、Xcodeは実際にこれが本当かどうかを判断するのに十分な情報を提供していません。
Cocoapods
を使用してプロジェクトにCorePlot
を追加しています。私は次のクラスをSwiftに移行しようとしています:
#import <Foundation/Foundation.h>
@class CPTScatterPlot;
@interface ScatterPlotContainer : NSObject
@property (nonatomic, strong) CPTScatterPlot *ahrsAlt;
@property (nonatomic, strong) CPTScatterPlot *calibration;
@property (nonatomic, strong) CPTScatterPlot *coreAlt;
@property (nonatomic, strong) CPTScatterPlot *pitch;
@property (nonatomic, strong) CPTScatterPlot *roll;
@property (nonatomic, strong) CPTScatterPlot *slip;
@end
#import <CorePlot/CPTScatterPlot.h>
#import "ScatterPlotContainer.h"
@implementation ScatterPlotContainer {
}
@end
import Foundation
class ScatterPlotContainer : NSObject {
public var ahrsAlt : CPTScatterPlot;
public var calibration : CPTScatterPlot;
public var coreAlt : CPTScatterPlot;
public var pitch : CPTScatterPlot;
public var roll : CPTScatterPlot;
public var slip : CPTScatterPlot;
}
#import <CorePlot/CPTScatterPlot.h>
ブリッジングヘッダーファイルから#import <CorePlot/CPTScatterPlot.h>
をコメントアウトすると、Swiftでエラーが発生します。これは、CPTScatterPlotが何であるかわからないためです。
#import <CPTScatterPlot.h>
も試しましたが、どちらも機能しませんでした。
だから私が考えることができる唯一のことは、おそらく私が追加する必要があるある種のモジュール名があるココアポッドを使用しているからです。エラーメッセージは実際にはそれほど有用ではありません。誰かが私が行ったとんでもないエラーについての提案を持っていますか、何が起こっているのかを理解するために、よりわかりやすいエラーメッセージを取得する方法はありますか?
私は同じ答えをすべてしましたが、私の問題は解決されませんでした。私は、問題が壊れた関数呼び出しに関連していることを理解しました。
関数の構文は間違っていませんでしたが、その呼び出しメカニズムは間違っていました。
この問題の正確なエラーを確認するには、次を確認してください。
問題ナビゲーターを選択>エラーをクリックすると、エラーのログが表示されます>その中で、すべてのメッセージタブを選択します。
これにより、このエラーのすべての詳細ログが表示されます。
下にスクロールすると、私の場合のようにログを取得しました
それで、これを読むことで、関数呼び出しに何か問題があることがわかります。私は自分のコードを閲覧して解決しました。以下は正しいコードと間違ったコードです。
間違った方法:
var region = MKCoordinateRegionMake(self.mapView.userLocation.coordinate, span)
// It will not shown error here but when you build project compiler shows error.
右の方法:
let region = MKCoordinateRegion(center: self.mapView.userLocation.coordinate, span: span)
私はこの昨夜に出くわし、上記の何も私の問題を解決していませんでした。幸運なことに、1つ(1)のファイルはUTF-16に設定されたテキストエンコーディングであることがわかりました!!?! WTF ??
これは私が取り組んでいた最後のファイルであり、おそらく、1つの悪いカット/ペーストが奇妙なキャラクターをアリーナに「インポート」します。このファイル内のコードを切り取り、貼り付けて、ベアボーンテキストエディターに貼り付けました。ファイルを削除して再作成し、コードを貼り付け直します...動作します。
上記を実行しますが、ファイルのエンコードも確認してください! :-)
同じエラーメッセージが表示されました。助けになったのは、Swiftコンパイラー設定で最適化レベルを[なし]に設定することでした。これは私にとって実際には解決策ではなく、Swiftコンパイラ。
この問題の別の解決策は、同じファイル名のファイルが2つ以上ないことを確認することです。それは私のために問題を解決しました。
@Kampaiに、エラーログメッセージの処理に関するアドバイスをありがとう。私は読んで、いくつかのファイルが欠落していました:
<unknown>:0: error: no such file or directory:
どういうわけか、GitHubからのプル中に一部のファイルが削除されました。ファイルはディレクトリにありますが、Xcodeプロジェクトにはありません。
フォルダーを右クリックし、「...にファイルを追加」をクリックして、Xcodeに不足しているファイルを手動で追加します。これで問題は解決しました。
これはすでに何度か私に起こりましたが、今私はそれを修正する方法を知っています\ o /
派生データを削除してクリーニングするだけで助かりました
ファイルからファイルに細心の注意を払い、変更を元に戻し、そのファイルに問題があるかどうかを確認することで、このバグに3時間以上もひどい時間を費やしました。最初の答えを試しましたが、何も答えませんでした。問題が見つかりました。サブクラスの計算プロパティと同じ名前の非計算プロパティがあったためです。将来のアップデートでこの種のケースを処理することで、デバッガがより堅牢になることを本当に願っています:(
DidSetブロックにこのコードを含めると、同じエラーが発生しました。
didSet {
// Test whether this view is currently visible to the user.
if super.isViewLoaded() && (super.view.window != nil) {
// (build fails even if this block is empty)
}
}
これを追跡するには多くの試行錯誤が必要でした。 super.
を削除すると、ビルドを続行できました。
残念ながら、このエラーは多くの場合、Swiftのコンパイラ内部のグリッチが原因です。理由を見つけるのは必ずしも簡単ではありません。クリーニングが機能しない場合は、最後に書いたコード(必要に応じてファイル全体も)にコメントを付けてみることをお勧めします。通常、最後に入力したコードにコメントを付けると、コンパイルが復元され、より意味のあるエラーが発生します。そこから、このエラーの原因となった命令に到達するまで、コードを1つずつコメント解除する必要があります。 Swiftコンパイラはまだかなり若く、時々奇妙なエラーを報告します。これらの種類のエラーは、開発者を助けるのではなく、さらに混乱させるだけなので、まったく役に立ちません。 Appleコンパイラを変更して、より詳細な情報を提供し、この迷惑なエラーが表示されないようにします。
NSString const *kGreenColor = @"#00C34E";
Constant.hファイルに上記の行がありました。これはプリプロセッサ専用です。その行を削除するとうまくいきました。
これと同じエラーが発生しました。問題は、オプションではないパラメーターでメソッドをオーバーライドし、オーバーライドでパラメーターをオプションにしたことです。 (以下のmethod
パラメーター)
func logNetworkCallDurationForMethod(method:String, path:String, milliseconds: UInt) {
}
override func logNetworkCallDurationForMethod(method:String?, path:String, milliseconds: UInt) {
}
1)問題があるファイルを特定します。コンパイル命令をコピーしてコンソールに貼り付けると、最後の画面にエラーの説明が含まれます。問題が特定されたPID番号に注意してください。次に、上にスクロールしてpidと関連する命令を見つけます-pidごとに1つのファイルがあるので、問題のあるファイルを見つけます。
2)ファイルを調べて、最後に変更したすべてを確認します。 gitを初期化した場合は、使用できます
git diff <file name>
私の場合、メソッドのオーバーライドは間違っていました。基本クラス:
open func send(_ onSuccess: @escaping ((SomeType) -> Void)) -> SomeType { }
サブクラス:
open override func send(_ onSuccess: ((SomeType) -> Void)) -> SomeType { }
ご覧の通り、@escaping
不足している。 XCode8のSwift3コンバーターは継承関係を考慮していません。さらに、型の間違いはエラーとしてマークされていません。
これは私に起こり、ログインナビゲーターのログインを読んだ後、同じ名前の2つのSwiftファイルがあります。これにより問題が発生し、ビルドに失敗していました。
誤ってシンボリックリンク(エイリアス)をドラッグして、実際のファイルではなくソースファイルをプロジェクトに入れていました。
プロジェクトにファイルがないため、このエラーが発生しました。このファイルを再度追加すると、すべてがうまくいきました。
私の場合、ファイルの名前を変更していました。コミットした後、Xcodeプロジェクトでファイル名がまだ変更されていないことがわかりました(理由はわかりません)が、ファイルはグレーアウトされていました。名前を変更して再度コミットすると、うまくいきました。
したがって、ソース管理を使用してファイルに変更を加えるときは、このエラーに注意する必要があります。
これは、不変のプロトコル引数からメソッドを参照しようとしたときに起こりました(間違って、メンバーはプロパティだと思いました)。
次のようなインターフェースを持っています:
public protocol NSValidatedUserInterfaceItem {
func tag() -> Int
}
func validateUserInterfaceItem(anItem: NSValidatedUserInterfaceItem) -> Bool {
print(anItem.tag) // oopsie, tag is a function
return false
}
func validateUserInterfaceItem(anItem: NSValidatedUserInterfaceItem) -> Bool {
print(anItem.tag()) // this is cool for Swift
return false
}
CoreDataでファイルを2回生成しました(そして自分で追加しました)。ファイルが重複していないことを確認してください。
他のみんなが彼らのものを見せているので、私は私のものを見せます:
class Foo : UIView {
var pathPosition:Double = 0.0 { didSet {
pathPosition = min(max(0.0, pathPosition), 1.0) // crashes if this line is present
self.pathPosition = min(max(0.0, pathPosition), 1.0) // but not here
}}
}
信じられないほど、これはPlaygroundには表示されませんが、フレームワークのコードに配置すると失敗します。これは正当な構文ですが(動作に使用され、遊び場でも動作します)、SwiftコンパイラーはpathPositionをself.
で修飾する必要があるようです。(比較的)古いコードですコンパイルに使用したため、6.1で何かが壊れた可能性があります。
私は気が狂っているように感じますが、周囲のコードがこの問題に影響を与える可能性がある、より大きな複雑さの問題がここで起こっているように感じます。昨夜、物事がコンパイルされるのを見て、今日もコードと設定をいくつか変更しましたが、再び失敗しました。今日、私はそれを動作させるために本当にたくさんの愚かなコードをハックしなければなりませんでした:
var pathPosition:Double = 0.0 { didSet {
// bug: insane!! - have to clobber the value before resetting!
let bugOldValue = pathPosition
self.pathPosition = 1.0 // fails without this nonsensical line!
self.pathPosition = min(max(0.0, bugOldValue), 1.0)
}}
価値のあることについては、上記の有用な手順に従って、私が受け取った実際のエラーメッセージは次のとおりでした。
PHI node has multiple entries for the same basic block with different incoming values!
%14 = phi double [ 1.000000e+00, %10 ], [ %11, %10 ], [ 1.000000e+00, %9 ], [ 0.000000e+00, %9 ], !dbg !4818
label %10
double 1.000000e+00
%11 = phi double [ %7, %entry ], !dbg !4815
LLVM ERROR: Broken function found, compilation aborted!
明日は怖いです。
私の場合、シミュレータのバグで、シミュレータからアプリをアンインストールし、プロジェクトを削除してからプロジェクトを実行します。
bridgeファイルをプロジェクトレベルに移動すると、問題が解決します。
@Kampalに関しては、関数呼び出しでどれだけ指定するかを判断するのにまだ苦労しています。たとえば、UIColorオブジェクトを作成するには、UIColorを指定する必要がある場合とそうでない場合があります。
これらは両方とも機能します:
playButton.backgroundColor = .darkGrayColor()
playButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
これにより、exit code 1
デバッガーの警告なしのコンパイル時のエラー。 #time-sucking debug vortex
playButton.setTitleColor(.whiteColor(), forState: UIControlState.Normal)
したがって、新しいルールがあります。複数のパラメーターを受け取る関数を使用する場合は、明示的に指定してください。
再生に戻りますSwift: AVOID THE VORTEX