Swiftの初心者として、私はSwiftでAppを構築しています。 TestOC2Swft.swiftでSwiftとObjective-Cでグローバル変数を割り当てられない
私はmacStrと呼ばれるグローバル変数を作成:
var macStr:String?
を、私はそれに値を代入する機能(機能1)があります。
func changeWindVol(inputStr:NSString){
macStr=inputStr as String
}
をそして私はまた別のものを持っていますこの文字列を取得するには、関数(Func 2)を使用します。
@IBAction func TestBtn(_ sender: Any) {
print(macStr! as String)
}
String inputStrは3番目の部分Y Objective-Cのファイル:
のFunc 1の前に、macStrがnil:
TestOC2Swft *testSw = [[TestOC2Swft alloc]init];
[testSw changeWindVolWithInputStr:dev.mac];
は、それから私は、デバッグ・モジュールを実行します。 Func 1の後
我々はmacStrが正しく割り当てられていることがわかります。 いつか、Func 2で: capture at func 2。
macStrの値が再びnilになります。
最後に、いくつかの長い長いエラーメッセージが表示されます。
libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, file : Swift.StaticString, line : Swift.UInt, flags : Swift.UInt32) -> Swift.Never:
...
Swift.StaticString, line : Swift.UInt, flags : Swift.UInt32) -> Swift.Never).(closure #2)
...
0x100400444 <+116>: bl 0x1002e14dc ; function signature specialization <preserving fragile attribute, Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->() to @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out()), Argument Types : [@callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->()]> of generic specialization <preserving fragile attribute,()> of Swift.StaticString.withUTF8Buffer <A> ((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A
-> 0x100400448 <+120>: brk #0x1
私は完全にこのエラーメッセージを理解することはできません。
私の貧弱なアプリケーションで何が問題なのですか?グローバル変数macStrを変更するにはどうしたらいいですか?
MacBtnは、他のケースではnilであることがわかります。私の推測?同じオブジェクトを使用していません。 – Larme
@Larme:あなたが "TestOC2Swft * testSw = [[TestOC2Swft alloc] init];と書いたとき、 OCファイルで、別のTestOC2Swft.swiftオブジェクトを作成して、macStrが別のオブジェクトを参照するようにしますか?どのようにして、すべてのTestOC2Swft.swiftクラスオブジェクトで同じ値を共有できますか? – BoweiTsai
@boweitsai:TestBtnはIBActionです。あなたが単にTestOC2Swftの新しいインスタンスをインスタンス化し、それをモーダルに提示したり、ナビゲーションスタックにプッシュしたりすることはありません。あなたがTestOC2Swftの別のインスタンスをタップしてTestOC2Swftの別のインスタンスのmacStrを設定するので、明らかにボタンをタップしたときには、それでは無しです。 –