代码之家  ›  专栏  ›  技术社区  ›  plamkata__

Swift到Kotlin,管理不可变列表

  •  0
  • plamkata__  · 技术社区  · 8 年前

    我正在尝试将现有的Swift代码移植到Kotlin,我希望对以下Swift代码使用最佳实践:

    struct Deck {
    
        private(set) var cards: [Card]
    
        var cardsCount: Int {
            return self.cards.count
        }
    
        init(cards: [Card] = []) {
            self.cards = cards
        }
    
        mutating func add(card: Card) {
            self.cards.append(card)
        }
    }
    

    设计目标是:

    1. cards 属性在类外不可修改,因此其类型应为 List<Card>

    2. fun add(card: Card) 应修改内部 列表

    在Kotlin中有没有一种方法可以在不使用两个单独属性的情况下实现这一点 private var mutableCards: MutableList<Card> 和一个计算属性 val cards: List<Card> get() = this.mutableCards

    对于这种情况,我需要一些最佳实践。

    1 回复  |  直到 8 年前
        1
  •  0
  •   mugx    8 年前

    自只读 List “引擎盖下”也是 mutable list ,您可能希望利用强制转换 MutableList ,这样做:

    class Card {
    }
    
    class Deck(cards:List<Card>){
        var cards:List<Card>
    
        init {
           this.cards = cards
        }
    
        public fun add(card:Card) {
          (cards as MutableList<Card>).add(card)
       }
    }
    
    fun main(args: Array<String>) {    
       var cards:List<Card> = arrayListOf()
       // here I can't modify cards
       var deck = Deck(cards)
       deck.add(Card())
       print(deck.cards.count()) // printing 1
    }
    

    为了能够测试它,复制并粘贴 here .