Swift: ‘Ранг? не имеет члена с именем ‘simpleDescription’?

#enums #switch-statement #swift #optional

#перечисления #оператор переключения #swift #тип параметра

Вопрос:

Я продолжаю получать ошибку в строках моего кода ниже:

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

в котором утверждается, что ‘Rank?’ не имеет члена с именем ‘simpleDescription’. Я нахожу это странным, поскольку я написал этот код в соответствии с руководством Apple и нигде не реализовал опции и в качестве ранга? предполагает, что у меня есть. Я хотел бы знать, почему он выдает мне эту ошибку и откуда берется необязательный параметр, если он действительно существует. Большое вам спасибо!

Вот мой код:

 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);
  

Ответ №1:

Проблема в том, что fromRaw не создает Rank , а скорее Rank? (необязательный тип Rank ). simpleDescription является частью Rank и не 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 ) является необязательным, но вы гарантируете, что он действительно содержит значение. Затем компилятор позволит вам обрабатывать его как a Rank и неявно извлекать значение по мере необходимости.

Однако это снижает безопасность, которую вы получаете с помощью опций. Если бы метод был вызван со значениями (999 888), например, необязательные значения, возвращаемые fromRaw , были бы nil , и это вызвало бы ошибку времени выполнения, если бы вы попытались их использовать. Вам следует перепроектировать этот метод, чтобы более правильно использовать преимущества опций, которые я слишком устал делать прямо сейчас.

Комментарии:

1. @Jonathano’Farrell: Нет проблем!