CompactMapValues ​​не работает с этим простым словарем - PullRequest
0 голосов
/ 19 июня 2020

У меня есть модель, которая выглядит так:

public struct Profile {
  public let bio: String?
  public let company: String
  public let createdDate: Date
  public let department: String
  public let email: String
  public let firstName: String
  public let coverImageURL: URL?
  public let jobTitle: String
  public let lastName: String
  public let location: String?
  public let name: String
  public let profileImageURL: URL?
  public let roles: [String]
  public let isActive: Bool
  public let updatedDate: Date?
  public let userID: String

  public init(
    bio: String?, company: String, createdDate: Date, department: String, email: String, firstName: String, coverImageURL: URL?, jobTitle: String,
    lastName: String, location: String?, name: String, profileImageURL: URL?, roles: [String], isActive: Bool, updatedDate: Date?, userID: String) {
    self.bio = bio
    self.company = company
    self.createdDate = createdDate
    self.department = department
    self.email = email
    self.firstName = firstName
    self.coverImageURL = coverImageURL
    self.jobTitle = jobTitle
    self.lastName = lastName
    self.location = location
    self.name = name
    self.profileImageURL = profileImageURL
    self.roles = roles
    self.isActive = isActive
    self.updatedDate = updatedDate
    self.userID = userID
  }


}

extension Profile: Equatable { }

Я пытаюсь создать кортеж, который представляет его как (model: Profile, json: [String: Any])

, используя следующий метод -

  func makeProfile() -> (model: Profile, json: [String: Any]) {

    let updatedDate = Date()
    let updatedDateStr = updatedDate.toString(dateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX")
    let createdDate = Date()
    let createdDateStr = createdDate.toString(dateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX")

    let coverImageURL = makeURL("https://headerUri.com")
    let profileImageURL = makeURL("https://pictureUri.com")
    let model = Profile(
      bio: "Some Bio",
      company: "Cool Job INC",
      createdDate: createdDate,
      department: "Engineering",
      email: "name@domain.tld",
      firstName: "Anne",
      coverImageURL: coverImageURL,
      jobTitle: "Test Dummy",
      lastName: "Employee",
      location: "London",
      name: "Anne Employee",
      profileImageURL: profileImageURL,
      roles: ["ADMIN"],
      isActive: true,
      updatedDate: updatedDate,
      userID: UUID().uuidString
    )

    let json: [String: Any] = [
      "bio": model.bio,
      "company": model.company,
      "createdDate": createdDateStr,
      "department": model.department,
      "email": model.email,
      "firstName": model.firstName,
      "headerUri": model.coverImageURL?.absoluteString,
      "jobTitle": model.jobTitle,
      "lastName": model.lastName,
      "location": model.location,
      "name": model.name,
      "pictureUri": model.profileImageURL?.absoluteString,
      "roles": model.roles,
      "isActive": model.isActive,
      "updatedDate": updatedDateStr,
      "userId": model.userID
      ].compactMapValues { $0 }

    return (model: model, json: json)
  }
}

extension Date {
  func toString(dateFormat format: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = format
    return dateFormatter.string(from: self)
  }
}

Все дополнительные свойства показывают предупреждение Expression implicitly coerced from 'String?' to 'Any'

enter image description here

Я добавил .compactMapValues { $0 } к dict, но не имел эффект.

Как убрать это предупреждение?

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Вы получаете сообщение об ошибке, потому что пытаетесь неявно привести необязательное значение (которое может быть nil) к Any, что скрывает, что значение может быть nil.

compactMapValues не гарантировать во время компиляции, что значение не равно нулю; все, что знает компилятор, это то, что что-то, что является необязательным (например, String?), теперь рассматривается как необязательное Any.

Один из способов избежать ошибки - это указать значение по умолчанию вместо необязательный:

let json: [String: Any] = [
   "bio": model.bio ?? ""
    // ...
   ]

В качестве альтернативы вы можете создать словарь: [String, Any?] для присвоения значений, а затем использовать .compactMapValues, что вернет вам необязательные значения Any.

let withOptionals: [String: Any?] = [
   "bio": model.bio,
   // ...
]

let json: [String, Any] = withOptionals.compactMapValues { $0 }
0 голосов
/ 19 июня 2020

Вы получаете предупреждение, потому что значения не являются обязательными при инициализации словаря . Ваш .compactMapValues { $0 } не поможет, потому что к тому времени уже «слишком поздно».

Вместо этого вы можете инициализировать пустой словарь и добавить значения 1 на 1.

var json = [String: Any]()
json["bio"] = model.bio
json["company"] = model.company
// all of the other values
json["userId"] = model.userID
...