AnyHashable не конвертируется в - PullRequest
0 голосов
/ 29 апреля 2018

Я конвертирую код своего проекта Objective-C в Swift. Дело в том, что, хотя его цикл находится в цикле, я сталкиваюсь с ошибкой, похожей на проблему преобразования типов. Заранее спасибо.

class GymUserSession: NSObject {

var passes = [AnyHashable]()

func getPassList() -> [AnyHashable]? {
        var list = [AnyHashable]()
        for pass: GymPass? in passes {
            if pass?.isGift == nil || pass?.activated != nil {
                if let aPass = pass {
                    list.append(aPass)
                }
            }
        }
        return list
    }
}

GymPass - это еще один класс NSObject

class GymPass: NSObject {
var gymID : String
var passID : String
var isGift : Bool
var activated : Bool
var dateCreated : Date?
var dateActivated : Date?
}

Error screen

1 Ответ

0 голосов
/ 29 апреля 2018

Краткий ответ: Свифт не может неявно понизить AnyHashable до GymPass, что вы и просили.

Вы могли бы исправить ошибку, явно понижая ее, но на самом деле это всего лишь одна маленькая проблема, которая позволила бы скомпилировать код

В Swift вы всегда должны использовать наиболее явный тип, какой только можете, когда он известен. Такие типы, как Any, AnyObject и AnyHashable, следует использовать только в том случае, если вы не знаете тип или их может быть несколько. Например, для словаря, полученного при декодировании JSON, может быть [String:Any], поскольку вы знаете, что он будет иметь String ключей, но типы значений будут различаться.

В этом случае, вероятно, вы знаете, что passes будет содержать GymPass экземпляров. Более «Swifty» версия вашего кода может выглядеть примерно так (но трудно быть конкретным, так как у меня недостаточно подробностей о том, откуда поступают данные и чего вы пытаетесь достичь):

struct GymPass {
    var gymID: String
    var passID: String
    var isGift: Bool
    var dateCreated: Date
    var dateActivated: Date?
    var isActivated: Bool {
        get {
            return self.dateActivated != nil
        }
    }
}

class GymUserSession: NSObject {

    var passes = [GymPass]()

    func getPassList() -> [GymPass] {

        return passes.filter ( { $0.isGift || $0.isActivated } )

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...