2016-05-12 54 views
2

我的目標C代碼(這是蘋果AdvancedCollectionView源代碼的提取物)對象鑄造/的ObjectiveC從斯威夫特

@interface AAPLCollectionViewWrapper : NSObject 

+ (UIView *)wrapperForCollectionView:(UICollectionView *)collectionView mapping:(AAPLDataSourceMapping *)mapping 
{ 
    if (!collectionView) 
    return nil; 

    BOOL measuring = NO; 

    if ([collectionView isKindOfClass:[AAPLCollectionViewWrapper class]]) 
    measuring = ((AAPLCollectionViewWrapper *)collectionView).measuring; 

    return (UIView *)[[AAPLCollectionViewWrapper alloc] initWithCollectionView:collectionView mapping:mapping measuring:measuring]; 
} 

我嘗試它迅速轉換,但我有一個問題,這條線:

return (UIView *)[[AAPLCollectionViewWrapper alloc] initWithCollectionView:collectionView mapping:mapping measuring:measuring]; 

在斯威夫特

return (CollectionViewWrapper(collectionView: collectionView, mapping: mapping, measuring: measuring) as! UIView 

我已經從「收藏此錯誤演員ViewWrapper'到無關類型'UIView'總是失敗

怎麼了?我怎樣才能將我的APPLCollectionViewWrapper轉換爲UIView?

修訂

我想我需要使用多態,在原始的源代碼,我發現這個評論:

/// An object that pretends to be either a UITableView 
/// or UICollectionView that handles transparently mapping from local to global index paths 
@interface AAPLCollectionViewWrapper : NSObject 

所以在源代碼中,AAPLCollectionViewWrapper是一個NSObject,函數wrapperForCollectionView返回UIView,然後將其轉換爲UICollectionView

.h

/// An object that pretends to be either a UITableView or UICollectionView that handles transparently mapping from local to global index paths 
@interface AAPLCollectionViewWrapper : NSObject 

/// Factory method that will determine whether the wrapper is measuring based on the collection view. If the collectionView is actually an instance of AAPLCollectionViewWrapper, the value will be pulled from the collectionView. Otherwise, the default is NO. 
+ (__kindof UIView *)wrapperForCollectionView:(UICollectionView *)collectionView mapping:(nullable AAPLDataSourceMapping *)mapping; 

+ (__kindof UIView *)wrapperForCollectionView:(UICollectionView *)collectionView mapping:(nullable AAPLDataSourceMapping *)mapping measuring:(BOOL)measuring; 

@property (nonatomic, strong, readonly) UICollectionView *collectionView; 
@property (nullable, nonatomic, strong, readonly) AAPLDataSourceMapping *mapping; 

@property (nonatomic, readonly) BOOL measuring; 

@end 

我怎麼能在swift中做同樣的事情?

+1

我對'AdvancedCollectionView'不太瞭解。但是我認爲如果它是一個'CollectionViewWrapper',應該有一種方法來獲取它所包裝的東西。嘗試找到解開包裝的屬性/方法。然後你會得到一個'CollectionView'。然後你可以直接返回這個'CollectionView',不需要投! – Sweeper

+0

在Swift中編寫您的CollectionViewWrapper類 –

回答

0

我會建議考慮「管」的模式,讓你的包裝必須是UICollectionView本身 - 需要從UICollectionView得出:

@interface AAPLCollectionViewWrapper : UICollectionView 
//... 

+ (UICollectionView *)wrapperForCollectionView:(UICollectionView *)collectionView mapping:(AAPLDataSourceMapping *)mapping 
//... 
0

從「CollectionViewWrapper」無關型「演員的UIView '總是 失敗

編譯器說它總是會失敗,但不會在運行時。如果它真的是一種UIView,它不會在運行時失敗。並且AAPLCollectionViewWrapper是一個Objective-C表達式,可能UICollectionView的擴展將是優雅的。