2015-06-20 55 views
0

我翻譯從目標C的Estimote「實施例」 iOS應用到夫特和遇到了平移以下一個問題:Objective-C的塊夫特封閉翻譯Estimote「實施例」的應用程序

@property (nonatomic, copy)  void (^completion)(CLBeacon *); 

- (id)initWithScanType:(ESTScanType)scanType completion:(void (^)(id))completion 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.scanType = scanType; 
     self.completion = [completion copy]; 
    } 
    return self; 
} 

demoViewController = [[ESTBeaconTableVC alloc] initWithScanType:ESTScanTypeBeacon 
               completion:^(CLBeacon *beacon) { 

    ESTDistanceDemoVC *distanceDemoVC = [[ESTDistanceDemoVC alloc] initWithBeacon:beacon]; 
    [self.navigationController pushViewController:distanceDemoVC animated:YES]; 
}]; 

這怎麼可以轉換成Swift?我已經嘗試了許多其他帖子和文檔的解決方案,但仍然沒有得到正確的語法。

回答

-1

大量的試驗和錯誤(不是我喜歡代碼的方式)後,該代碼似乎工作:

var completion: ((value: CLBeacon?) -> Void)? 

func initWithScanType(scanType: ESTScanType, 
        completion: ((AnyObject?) -> Void)) -> UIViewController 
{ 
    if let _:ESTBeaconTableVC = ESTBeaconTableVC() 
    { 
     self.scanType = scanType 
     self.completion = completion 
    } 
    return self 
} 

demoViewController = ESTBeaconTableVC().initWithScanType(
         ESTBeaconTableVC.ESTScanType.ESTScanTypeBeacon, 
                  completion:{ beacon in 

    let distanceDemoVC = ESTDistanceDemoVC().initWithBeacon(beacon as! CLBeacon) 
    self.navigationController!.pushViewController(distanceDemoVC!, animated:true) 
}) 

我還沒有找到一個很好的參考,說明從對象 - 斯威夫特過渡變量聲明,函數定義和函數調用都在一個地方,使用一個連貫的例子。

0

首先,初始化器被稱爲init;他們沒有func。要調用超類初始化程序,您可以執行super.init(),而無需檢查nil的回報。此外,類人的自有財產應該調用父類的初始化之前進行初始化:

init(scanType: ESTScanType completion: (CLBeacon? -> Void)?) { 
    self.scanType = scanType 
    self.completion = completion 
    super.init() 
} 

然後,您創建一個對象,並通過調用類的名稱叫初始化。如果調用的最後一個參數是函數類型,則可以使用尾隨閉包表達式。您應該使用可選鏈而不是強制可選,以保持與Objective-C相同的行爲,當它在nil上調用時不會崩潰。

demoViewController = ESTBeaconTableVC(scanType:ESTScanTypeBeacon) { beacon in 
    let distanceDemoVC = ESTDistanceDemoVC(beacon:beacon) 
    self.navigationController?.pushViewController(distanceDemoVC animated:true) 
}