【问题标题】:Swift: 'Rank? does not have a member named 'simpleDescription'?斯威夫特:“等级?没有名为“simpleDescription”的成员?
【发布时间】:2014-06-15 04:09:36
【问题描述】:

我在下面的代码行中不断收到错误:

let rank1desc = rank1Conv.simpleDescription();
let rank2desc = rank2Conv.simpleDescription();

声称“排名?”没有名为“simpleDescription”的成员。我发现这很奇怪,因为我根据 Apple 的教程编写了这段代码,并且没有在任何地方实现和可选项作为 Rank?表明我有。我很想知道为什么它给了我这个错误,以及如果确实存在可选的选项来自哪里。非常感谢!

这是我的代码:

enum Rank: Int{
   case Ace = 1;
   case Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10;
   case Jack = 11, Queen = 12, King = 13;

   func simpleDescription() -> String{
       switch self{
       case .Ace:
           return "Ace";
       case .Jack:
           return "Jack";
       case .Queen:
           return "Queen";
       case .King:
           return "King";
       default:
           return String(self.toRaw())
       }
   }
}

let ace = Rank.Ace;
let aceRawValue = ace.toRaw();

 func compRank(rank1: Int, rank2: Int) -> String{
    let rank1Conv = Rank.fromRaw(rank1);
    let rank2Conv = Rank.fromRaw(rank2)
    let rank1desc = rank1Conv.simpleDescription();
    let rank2desc = rank2Conv.simpleDescription();

    if(rank1 > rank2){
        return rank1desc;
    }
    else if(rank2>rank1){
        return rank2desc;
    }
    else{
       return "They are equal";
    }
}

compRank(rank1: 3, rank2: 2);

【问题讨论】:

    标签: enums switch-statement swift optional


    【解决方案1】:

    问题是fromRaw 不会产生Rank,而是Rank?Rank 类型的可选)。 simpleDescriptionRank 的一部分,而不是 Rank?。您需要从中提取Rank 值(并测试是否存在值)才能访问simpleDescription

    如果您可以保证始终使用有效值调用 compRank,则修复代码的最简单方法是替换以下行:

        let rank1Conv = Rank.fromRaw(rank1);
        let rank2Conv = Rank.fromRaw(rank2)
    

    ...用这个:

        let rank1Conv:Rank! = Rank.fromRaw(rank1)
        let rank2Conv:Rank! = Rank.fromRaw(rank2)
    

    ! 告诉编译器rank1Conv(和rank2Conv)的类型是可选的,但您保证它确实包含一个值。然后,编译器会让您将其视为 Rank,并根据需要隐式提取值。

    但是,这破坏了您使用可选选项获得的安全性。例如,如果使用值 (999,888) 调用该方法,则fromRaw 返回的可选值将是nil,如果您尝试使用它们会导致运行时错误。您应该重新设计此方法以更恰当地利用可选项,我现在太累了,无法这样做。

    【讨论】:

    • @JonathanO'Farrell:没问题!
    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2017-07-22
    • 2017-03-24
    • 2014-08-02
    相关资源
    最近更新 更多