2017-06-24 2 views
0

私はSwiftで2つの異なる関数を定義しました。Objective-Cからの呼び出し方法をテストするだけです。 't!Objective-CからいくつかのSwift関数を呼び出せません(その他のもの)

私はここでそれらを定義した:Objective-Cで

public extension UIViewController { 
    func testAddingOperationTo(array: inout [Operation]) -> Operation { 
     let completionBlock = BlockOperation (block: { 
      print("completionOperation") 
     }) 

     return completionBlock; 
    } 

    func testSomethingWith (count: Int){ 
     print("testing something \(count)") 
    } 
} 

、私は正しいヘッダファイルをインポートした、と私はちょうど罰金第二メソッドを呼び出すことができます。

[self testSomethingWithCount:0]; 

しかし、最初のものは動作しません... Xcodeの自動補完では表示されません。手動で入力してもビルドエラーが発生します。私はこのように呼びたいと思っています:

NSOperation *completionOperation = [self testAddingOperationToArray: operationsList]; 

何が間違っていますか?私が間違って機能を定義したのでしょうか、それとも私が気づいていないSwiftについてのあいまいなルールがありますか?

答えて

2

@objcをメソッド宣言の前に置くと、特にObjective-Cのメソッドを使用することをSwiftコンパイラに指示できます。コンパイラはあなたにパラメータの型が表現されていないを告げた場合、それはいいだろう

@objc func testAddingOperationTo(array: [Operation]) -> Operation { 
// Method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C 

、:メソッドが何らかの理由でのObjective-Cから呼び出し可能でない場合は、他の効果の中で、これはコンパイラの問題がエラーになりXcode 9ベータ2では、そうではありません。

とにかく、この場合の問題は、Swift inoutのパラメータをObjective-Cで表すことができないことです。パラメータがinoutである必要がない場合は、そのキーワードを取り出すだけで、メソッドはObjective-Cにブリッジされます。

関数が変更できる配列を渡す必要がある場合は、NSMutableArrayを取る別のバージョンを追加する方法もあります。 2番目のバージョンはObjective-Cにブリッジされています:

func testAddingOperation(to array: inout [Operation]) { 
    let completionBlock = BlockOperation (block: { 
     print("completionOperation") 
    }) 
    array.append(completionBlock) 
} 

@objc func testAddingOperation(toOperations mutableArray: NSMutableArray) { 
    var array = mutableArray.map({ $0 as! Operation }) 
    testAddingOperation(to: &array) 
    mutableArray.replaceObjects(in: NSRange(location: 0, length: mutableArray.count), withObjectsFrom: array) 
} 
1

ヘッダーのインポートは、ほとんどの場合です。ただし、いくつかの例外があります。

例外が使用されているタイプは、架橋型(例えば、NSString及びString)であることです。 Objective Cがinoutを認識しないため、inoutUnsafeMutablePointerに書き換える必要があります。だから、Objective C型を使うか、どちらの型にも関数を書く必要があります。

+0

スウィフトでObjective-Cタイプを使用するにはどうすればよいですか?どうすればUnsafeMutablePointerでメソッドを書き直し、渡された配列に操作を追加することができますか? –

+0

Swiftの 'Array'は' NSArray'との間でブリッジされています。問題は 'inout'の使用であり、' Array'の使用ではありません。 –

関連する問題