2017-09-17 5 views
0

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の後

after 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を変更するにはどうしたらいいですか?

+1

MacBtnは、他のケースではnilであることがわかります。私の推測?同じオブジェクトを使用していません。 – Larme

+0

@Larme:あなたが "TestOC2Swft * testSw = [[TestOC2Swft alloc] init];と書いたとき、 OCファイルで、別のTestOC2Swft.swiftオブジェクトを作成して、macStrが別のオブジェクトを参照するようにしますか?どのようにして、すべてのTestOC2Swft.swiftクラスオブジェクトで同じ値を共有できますか? – BoweiTsai

+0

@boweitsai:TestBtnはIBActionです。あなたが単にTestOC2Swftの新しいインスタンスをインスタンス化し、それをモーダルに提示したり、ナビゲーションスタックにプッシュしたりすることはありません。あなたがTestOC2Swftの別のインスタンスをタップしてTestOC2Swftの別のインスタンスのmacStrを設定するので、明らかにボタンをタップしたときには、それでは無しです。 –

答えて

1

ここではシングルトンパターンのメリットがあると思います。別のスウィフトのファイルに:

class GlobalVariables { 
    static var macStr: String? 
} 

次に機能1:

機能2では
func changeWindVol(inputStr:NSString){ 
    GlobalVariables.macStr = inputStr as String 
} 

@IBAction func TestBtn(_ sender: Any) { 
    guard let macStr = GlobalVariables.macStr else { return } 
    print(macStr) 
} 
-1

私は単純にすることで、この問題を解決:

を置きますクラス外の変数の定義。ここで

はコードです:

var macStr:String? 
class TestOC2Swft { 
... 
} 

そして、変数 "macStrは" すべてのファイルで共有することになります。プロジェクトには「macStr」が1つしかありません。

この問題を解決するもう1つの方法は@PranavKasettiです。

関連する問題