Предположим, вы отказались от неиспользуемых инициализации. Ваша структура содержит title
и author
, которые не являются Дополнительно, так что ваш инициализатор отражает это. Не позволяйте им пытаться создать книгу, если они не могут предоставить титул и автора.
Другие два объекта: Дополнительно. Я предлагаю вам предоставить значения nil
по умолчанию в инициализаторе для тех, что дает ваш пользователь большую гибкость в создании Book
:
struct Book {
let title: String
let author: String
let price: String?
let pubDate: String?
init(title: String, author: String, price: String? = nil, pubDate: String? = nil) {
self.title = title
self.author = author
self.price = price
self.pubDate = pubDate
}
}
let book1 = Book(title: "The Hitchhiker's Guide to the Galaxy", author: "Douglas Adams")
let book2 = Book(title: "The Shining", author: "Stephen King", price: "20.00")
let book3 = Book(title: "Little Women", author: "Louisa May Alcott", price: "15.99", pubDate: "1868")
let book4 = Book(title: "Harry Potter", author: "J. K. Rowling", pubDate: "1997")
Если вы действительно хотите, чтобы быть в состоянии пройти в nil
ни за что, но потерпеть неудачу, если они не обеспечивают title
и author
, а затем использовать guard
разворачивать title
и author
, в противном случае не в состоянии и вернуть nil
:
init?(title: String? = nil, author: String? = nil, price: String? = nil, pubDate: String? = nil) {
guard let title = title, author = author else { return nil }
self.title = title
self.author = author
self.price = price
self.pubDate = pubDate
}
// These all return nil
let book5 = Book()
let book6 = Book(title: "War and Peace")
let book7 = Book(author: "Ray Bradbury")
let book8 = Book(title: "Pride and Prejudice", price: "40.00", pubDate: "1813")
Ваш метод 'init?' Не принимает никаких необязательных аргументов. - Возможно, вы имели в виду 'init? (Title: String ?, author: String ?, ...)'? –
только цена и pubDate являются опциями в моей структуре. Добавление 'price: String ?, pubDate: String?) {...' не исправило мою ошибку. –
Я смущен - при каких обстоятельствах ваш инициализатор терпит неудачу? Вы не можете использовать 'if let' или' guard let' с непараллельными. – Hamish