代码之家  ›  专栏  ›  技术社区  ›  Olivier MATROT

将Swift中的协议/委托映射到c#

  •  0
  • Olivier MATROT  · 技术社区  · 6 年前

    我试图了解Swift中协议和委托的用法,以及它们在c#for iOS中的等效性。

    微软对此有一份不错的文档 here 但对我来说,它缺乏c代码的swift或objectiveC对应物,无法让我理解该做什么。

    我正在移植一个 existing Swift gist c#Xamarin iOS。

    我有这个协议:

    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
    }
    

    我已经转换为:

    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);
    } 
    

    到现在为止,一直都还不错。

    在代码的后面,我有一个(目前)奇怪的声明:

    weak var delegate: GridLayoutDelegate?
    

    我担心的是,它在swift代码的后面永远不会被分配。

    现在我把c#类声明为:

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

    c#中的对应代码是什么?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Renat    6 年前

    Swift 语言使用 Automatic Reference Counting ,所以它需要 weak var 处理由循环引用引起的内存泄漏。

    作为反对, C# 使用垃圾收集器,它可以自行处理循环引用,而无需额外的手动操作(更多详细信息请参见此处: Garbage collector and circular reference 。当循环引用中的两个对象具有相似的生存期时,这是有效的,如果其中一个对象的生存期超过另一个对象而没有取消订阅,则可能会弹出 Lapsed listener problem )

    所以我想 C 你只需要:

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

    我不熟悉 Xamarin ,所以我不能肯定地说 @delegate 应该初始化。