无法将Int类型转换为期望值[MyCustomType]

时间:2017-09-07 05:05:24

标签: swift swift3

Xcode 8.3.3在这一行上给了我这个Swift 3错误

values2[index] = nextValue(currentValue)
  

无法转换类型' Int'预期参数类型'卡'

这是我的代码:

//
//  Card.swift
//  match
//
//  Created by quantum on 05/09/2017.
//  Copyright © 2017 Quantum Productions. All rights reserved.
//

import UIKit

class Card: NSObject {
    var quantity = 0
    var fill = 0
    var shape = 0
    var color = 0

    override var description : String {
        return "Q" + String(quantity) + "/F" + String(fill) + "/S" + String(shape) + "/C" + String(color)
    }

    override init() {
        super.init()
    }

    static func properties() -> [String] {
        return ["quantity", "fill", "shape", "color"]
    }

    static func isMatch(cards: [Card]) -> Bool {
        for property in self.properties() {
            var sum = 0
            for card in cards {
                sum = sum + (card.value(forKey: property) as! Int)
            }
            if !([3, 6, 9, 7].contains(sum)) {
                return false
            }
        }
        return true
    }

    static func deck(_ values: [Int], _ index: Int, _ max: Int, _ acc: [Card]) -> [Card]{
        let currentValue = values[index]
        var values2 = values
        if currentValue >= max {
            if index == 0 {
                return acc
            }

            values2[index] = 0
            values2[index-1] = values2[index-1] + 1
            return deck(values, index - 1, max, acc)
        } else {
            var acc2 = acc
            let card = Card()
            for (index, element) in self.properties().enumerated() {
                card.setValue(values[index], forKey: element)
            }
            acc2.append(Card())
            values2[index] = nextValue(Card())
            return deck(values2, index, max, acc2)
        }
    }

    func nextValue(_ v: Int) -> Int {
        if (v == 0) {
            return 1
        } else if (v == 1) {
            return 2
        }

        return 4
    }

    static func deck() -> [Card] {
        return deck([1,1,1,1], 4, 3, [Card]())
    }
}

这是我Card班的内容。

奇怪的是,如果我尝试(这是错误的,我正在测试编译器错误)

   values2[index] = nextValue(Card())

我收到错误Cannot assign the value of type (Int) -> Int to type 'Int'

斯威夫特认为我的CardInt?我对发生的事情感到困惑。

我希望使用变量currentvalue来调用nextvalue,它应该是Int。

2 个答案:

答案 0 :(得分:1)

静态方法不能调用实例方法:这个想法毫无意义,因为没有实例。因此,您对nextValue的引用是不可能的。这就是为什么这条线存在问题。静态方法deck如何调用实例方法nextValue

答案 1 :(得分:1)

来自编译器的错误消息。

您的问题是deck已宣布为static,但您正在尝试调用未声明为nextValue的{​​{1}}。这意味着static隐含地使用隐藏的参数nextValue,但self并未提供它。

如果您将deck添加到static声明中,它会像您期望的那样工作。 (您在引用func nextValue的行上会收到错误,但您会更近。)

为了使其正常工作,您可能希望所有这些功能都是非静态的。试想一下最初如何调用此代码(即如何获得self.properties的第一个实例)。