简体   繁体   中英

Mapping protocol/delegates in Swift to c#

I'm trying to understand the usage of protocol and delegates in Swift and their equivalence in c# for Xamarin.iOS.

Microsoft has a decent documentation about that here but for me it lacks the swift or objectiveC counterpart of c# code to allow me to understand what to do.

I'm in the process of porting an existing Swift gist to c# Xamarin iOS.

I have this protocol:

protocol GridLayoutDelegate: class {
    func scaleForItem(inCollectionView collectionView: UICollectionView, withLayout layout: UICollectionViewLayout, atIndexPath indexPath: IndexPath) -> UInt
    func itemFlexibleDimension(inCollectionView collectionView: UICollectionView, withLayout layout: UICollectionViewLayout, fixedDimension: CGFloat) -> CGFloat
    func headerFlexibleDimension(inCollectionView collectionView: UICollectionView, withLayout layout: UICollectionViewLayout, fixedDimension: CGFloat) -> CGFloat
}

That I have converted to:

public interface IGridLayoutDelegate
{
    uint ScaleForItem(UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath);
    nfloat ItemFlexibleDimension(UICollectionView collectionView, UICollectionViewLayout layout, nfloat fixedDimension);
    nfloat HeaderFlexibleDimension(UICollectionView collectionView, UICollectionViewLayout layout, nfloat fixedDimension);
} 

So far so good.

Later in the code I have this (for now) strange declaration:

weak var delegate: GridLayoutDelegate?

What concerns me is that it is never assigned later in the swift code.

For now I have my c# class declared as:

public class GridLayout : UICollectionViewLayout, IGridLayoutDelegate
{
...
}

What would be the corresponding code in c#?

Swift language uses Automatic Reference Counting , so it needs weak var to deal with memory leaks, caused by circular references.

As opposing, C# uses Garbage Collector, which handles circular references by itself without extra manual effort (more detailed here: Garbage collector and circular reference . This works when both objects in the circular reference have similar lifetime, if one of the objects outlives another without unsubscribing there might pop up Lapsed listener problem )

So I think in C# you just need:

public class GridLayout : UICollectionViewLayout, IGridLayoutDelegate
{
    private IGridLayoutDelegate @delegate;

I'm not familiar with Xamarin , so I cannot say for sure how @delegate should be initialized.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM