【问题标题】:Swift : multi-dimensional structure organization and initSwift:多维结构组织和初始化
【发布时间】:2021-07-14 02:28:19
【问题描述】:

这里初始化这个结构有两个简单的问题。

  1. 一个是枚举值 TS(我得到错误:无法将类型“TournNames”的值转换为预期的参数类型“TournamentName”)
  2. 另一个是初始化字符串数组(我收到错误:无法将类型“[String]”的值转换为预期的参数类型“TourmentScores”

假设我正在尝试建立一个结构来模拟网球运动员的得分以及他们在每个主要锦标赛中的所有比赛(只是为了好玩)。每个锦标赛都有一个名称(例如温布尔登)和该球员的一系列分数(例如,在首场比赛中,他们的分数可能是“4-6, 6-4, 7-6, 6-2”)。 . 每场比赛最多7场比赛。每个玩家应该有一个包含四个锦标赛的数组(名称和分数数组),最终应该有一个玩家数组。我也试图不太成功地使用枚举。理想情况下,如果我想知道罗杰·费德勒在今年第三场温网比赛中的表现,我会访问类似 player.tournament.wim.Roundof32 或类似的东西。但在我开始玩之前,我似乎无法为单个锦标赛初始化虚拟数据。

有什么想法吗?我认为这不是那么难的问题,但我只是不知道每个问题。有问题的两行见下方“***本行”

    // tournament name enum 
    
    enum TournNames : String {
       case wim = "Wimbledom"
       case fo = "French Open"
       case ao = "Australian Open"
       case uo = "US Open"
    }
    
        // 
    struct TournamentName  {
      var Tname  : TournNames  // = .wim
    }

    
    // This is the structure for a tournament score array with some dummy values.
    
    struct TouramentScores  {
       var Match1  : String = "7-6, 6-4, 3-6, 7-6"
       var Match2  : String = "7-6, 6-4, 3-6, 7-6"
 
    }
    


    // This is one entire Tournament record for one player = tournament name + array of scores ... the next goal but not used here until I get over these hurdles
    
    struct TournamentResult  {
       var TournamentName  : TournNames = .wim
       var Scores : TouramentScores
    }
    
   // ... finally the structure of a player ...

struct DummyTennisPlayer  {
   var LastName   : String  // last name
   var FirstName  : String  //first name
   var TN   :  TournamentName
   var TS   :  TouramentScores
 //  var WimRes   :  TournamentResult  // to start a single tournament
 //  var SeasonResults : [TournamentResult]   // ultimately should be an array of 4 tournaments



}
// trying to initialize some dummy data without success after trying several things

   extension DummyTennisPlayer {
      static var dummyResults : [DummyTennisPlayer] {
         [
            DummyTennisPlayer.init(
               LastName : "Federer",
               FirstName: "Roger",
               TN : TournNames.wim      // **** this line
              ,
              TS : ["XX", "yy"]        /// *** this line 
               )
         ]
      }
   }

【问题讨论】:

    标签: arrays swift multidimensional-array struct


    【解决方案1】:

    我想您会发现,一系列简单的嵌套类型不太可能在这里解决问题。一旦你找到像球员、锦标赛、比赛和查询这样的实体,比如“罗杰·费德勒在今年第三场温布尔登比赛中的表现”,你就成为了使用数据库的候选人,你可以在其中操作一对多和多对多的关系。我不能告诉你用什么数据库,反正这是一个见仁见智的问题;从你目前所说的来看,SQLite 就足够了(我个人并不是仅仅为了这种事情而喜欢 Core Data)。

    【讨论】:

      【解决方案2】:

      我猜你的代码是一种练习,所以在你稍后继续使用 Core Data 或 SQLite 之前,

      extension DummyTennisPlayer {
          static var dummyResults: [DummyTennisPlayer] = [
              DummyTennisPlayer(LastName: "Federer", FirstName: "Roger", WimbledomResult: TournamentResult(Scores: TouramentScores()))
          ]
      }
      

      应该回答你的问题。

      1 - 要初始化 Swift struct,请使用以下语法:

      MyStruct(property1: "my property1 value", property2: "my property2 value")

      2 - TournamentResult 中的锦标赛名称属性已设置为 .wim,因此您只需初始化 Scores。由于您的 TournamentScores 属性已经全部设置好,您只需将 TournamentScores() 的实例传递给 TournamentResult(Scores:)。 顺便说一句,变量或结构属性名称的第一个字母只能使用小写:var lastNameTournamentResult(s强>核心:)。

      我认为您混淆了“多维(数组)结构”一词(它们只是嵌套在其他数组中的数组,如下所示: [ [1, 2, 3], [2 , 3, 4], [3, 4, 5]]) struct 对象。您可能不应该在这里如此广泛地使用结构。

      不要犹豫,看看您决定使用 enumsstructsarrays 的方式。您的代码可能有效,但难以阅读和使用(例如:如果您将所有设置分数放在单个 String 中,您将如何访问特定设置分数?为什么不使用数组?)

      【讨论】:

        猜你喜欢
        • 2013-03-06
        • 2021-12-14
        • 2020-06-17
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多