2014-12-19 67 views
3

如果我有一個雨燕FUNC定義正是如此:Can Swift func()將多個值返回給Objective-C調用者?

func hilo (holeSize : Int, prompt : Int) -> (ballType : Int, ballColor : Int)) { 

... 
return (result1, result2) 

} 

有沒有辦法來調用一個Objective-C法這斯威夫特FUNC?我希望使用數組或字典來調用Objective-C的func來接收func結果。

似乎無法找到討論此主題的任何doco或其他。

謝謝。

回答

4

元組(返回多個值的函數)在Objective-C中不受支持,但您可以爲此使用塊。

- (void)hilo:(int)holeSize prompt:(int)prompt callback:(void (^)(ballType : Int, ballColor : Int))result { 
    ... 
} 


[self hilo:(int)holeSize prompt:(int)prompt callback:^(ballType : Int, ballColor : Int) { 
    .... 
}]; 
+0

你能提供的斯威夫特FUNC應如何改變的例子容納一個塊?即Swift函數會是什麼樣子,obj-c方法會是什麼樣子? – bmueller 2017-07-31 20:47:11

2

你不能。你將不得不重做你的Swift方法來返回在Objective-C中有效的類型。

來自:Apple Inc. Using Swift with Cocoa and Objective-C. iBooks。

只要與Objective-C兼容,您就可以訪問標有@objc屬性的類或協議中的任何內容。這不包括斯威夫特獨有特性,如這裏列出:

  • 泛型
  • 元組
  • 斯威夫特定義
  • 結構
  • 頂級功能斯威夫特
  • 定義在斯威夫特定義枚舉Swift中定義的全局變量
  • Swift中定義的類型別名
  • 夫特式variadics
  • 嵌套類型
  • 咖喱功能

例如,採用一個通用的類型作爲參數或 返回一個元組不會從目標C可用的方法。

重點煤礦

0

通過@ ikmal-ezzani的理想。我作爲波紋管一個FPGA實現細節:

斯威夫特代碼:

func getResult(_ input: Int) -> (previous: Int, next: Int) { 
    return (previous: input - 1, next: input + 1) 
} 

@objc class WrapClass: NSObject { 
    @objc static func getResult(_ input: Int, callback: ((_ previous: Int, _ next: Int) -> Void)) { 
     let (previous, next) = YourModel.getResult(input) 
     callback(previous, next) 
    } 
} 

對象的C代碼:

//to use in Object-C 
__block NSInteger pre = 0; 
__block NSInteger next = 0; 
[WrapClass getResult:10 callback:^(NSInteger preValue, NSInteger nextValue) { 
    pre = preValue; 
    next = nextValue; 
}];