2015-12-07 6 views
0

Я изучаю Swift и пишу базовую функцию инициализации карточной игры, где я хочу использовать функцию для настройки некоторых колод.Swift - функция без параметров с возвращаемым значением

Свифт продолжает жаловаться, что мне не хватает аргумента в параметре №1, но нет никаких параметров, и я не хочу этого.

Game класс следующим образом

class Game 
{ 
    // MARK: ** Private vars ** 
    private var gameState: GameState? 
    private var playerOnTurn: Player? 
    private var seedCash:Int? 

    // MARK: ** Public vars ** 
    lazy var players = [Player]() 
    var chequesDeck:Deck = Deck() 
    var propertiesDeck:Deck = Deck() 

    init() 
    { 
     self.gameState = .Initialize 
     self.playerOnTurn = nil // No player on turn when game is initialized 
     self.seedCash = kInitialSeedCash 
    } 

    func setup(numberOfPlayers:Int) 
    { 
     // Create decks of properties and cheques 
     self.propertiesDeck = Deck.createProperties() 
     self.chequesDeck = Deck.createCheques() 



    } 
} 

Deck класс следующим образом

// Deck of cards 
// Two deck types in the game - (1) Properties & (2) Cheques 

class Deck 
{ 
    private var cards:[Card] = [] // Empty Array 

    // @return: An array of cards 
    func createProperties() -> [Card] 
    { 
     var propertyDeck:[Card] = [] 


     // TODO: - Needs Local JSON reader 
     let prop1 = Card.init(name:"Cardboard box", value:1) 
     propertyDeck.append(prop1) 

     let prop2 = Card.init(name:"Outhouse", value:2) 
     propertyDeck.append(prop2) 

     let prop3 = Card.init(name:"Outhouse", value:3) 
     propertyDeck.append(prop3) 



     return propertyDeck 
    } 

    // @return: An array of cards 
    func createCheques() -> [Card] 
    { 
     var chequeDeck:[Card] = [] 

     // create 2 copies of each card, but skip 1s 
     for var i:Int = 0; i<=15; i++ 
     { 
      if (i != 1) 
      { 
       let chequeCard = Card.init(name: "Cheque", value: i * 1000) 
       chequeDeck.append(chequeCard) 
      } 
     } 

     return chequeDeck 
    } 

    func addCard() 
    { 

    } 

    func shuffle() 
    { 

    } 
} 

Deck() является class

func setup() { 

    var propertiesDeck:Deck = Deck() 

    // Create property deck 
    self.propertiesDeck = Deck.createProperties() 

} 

// Deck.createProperties file 
// @return: An array of cards 

func createProperties() -> [Card] 
{ 
    var propertyDeck:[Card] = [] 

    let prop1 = Card.init(name:"Penthouse", value:1) 
    propertyDeck.append(prop1) 

    return propertyDeck 
} 

Но Свифт продолжает жаловаться, что;

Отсутствует аргумент для параметра # 1 в вызове

Но нет никаких аргументов или параметров.

Возможно, я делаю что-то неправильно/глупо?

+1

Пожалуйста, покажите декларацию 'Deck' и показать нам, где эти функции определены. –

+0

Обновлен код, показывающий объявление класса Deck – zardon

+0

Вопрос, который у меня был, был много раз (поскольку я новый разработчик Swift); chequesDeck в игровом классе должен быть массивом карт, такими же, как propertiesDeck; были и другие проблемы. Но мне удалось получить карты для печати в журнал, что очень хороший шаг для меня. – zardon

ответ

0

Эта ошибка обычно говорит о том, что Deck ожидает некоторые параметры конструктора. Не могли бы вы разместить свой класс Deck, чтобы я мог видеть, есть ли они?

Также есть несколько предложений. Кажется, вы создаете переменную колоды propertiesDeck, но затем статически обращаетесь к createProperties, указав Deck.createProperties(). Если вы не звоните propertiesDeck.createProperties()? Также createProperties возвращает объект Array of the Card, но propertiesDeck - класс Deck.

+0

Это должен быть комментарий, а не ответ. –

+0

Я раньше не делал Swift, но его хороший комментарий к обзору – zardon

0

Поскольку вы заходите в функцию как это:

Deck.createProperties() 

вы, вероятно, хотите статический метод вместо:

static func createProperties() -> [Card] { 
    ... 
} 

Который не должен дать вам ошибку больше.

Другой способ сделать это работа по телефону createProperties() на ваш уже определены Deck как это (не рекомендуется):

self.propertiesDeck = propertiesDeck.createProperties() 

Причина отсутствующего параметра исходит из того, что методы принимают экземпляр класса, как их первый параметр, поэтому вы могли бы называть его как Deck.createProperties(propertiesDeck)().

Я считаю, что у вас есть какие-то другие недостатки в вашем коде, я буду стараться, чтобы сделать лучший пример для вас:

struct Card { 
    let name : String 
    let value : Int 
} 

class Deck { 
    var cards : [Card] 

    init() { 
     cards = [ 
      Card(name: "Penthouse", value: 1) 
     ] 
    } 
} 
+0

Я пробовал эту идею, но теперь ее высказывание «self.propertiesDeck = Deck.createProperties()» - не может назначить значение типа [Card] для ввода Deck ; Я, наверное, переусердствовал, поскольку колода - это всего лишь массив карт. – zardon

0

Try Это

func createProperties() -> [Card] 
{ 
    var propertyDeck:[Card] = [] 

    let prop1 = Card(name:"Penthouse", value:1) 
    propertyDeck.append(prop1) 

    return propertyDeck 
} 

Если это не работает затем покажите код для класса Deck и Card.

+0

Добавлен код для Карты и Палубы – zardon

0

Мы не можем ответить на ваш вопрос без полного кода. Нам нужен код вашего класса Deck.

Но вы можете попробовать класса funcs ...

public class Cards { 

class func createProperties() -> [Card] 
{ 
    var propertyDeck:[Card] = [] 

    let prop1 = Card.init(name:"Penthouse", value:1) 
    propertyDeck.append(prop1) 

    return propertyDeck 
    } 
}  

Вы можете вызвать функцию с:

Cards.createProperties() 
Смежные вопросы