2016-07-10 5 views
0

Это мой код:экземпляр failable метода инициализации

struct Book{ 
    let title: String 
    let author: String 
    let price: String? 
    let pubDate: String? 

init?(title: String, author: String, price: String, pubDate: String){ 
    guard let title = title, let author = author else { // error here 
     return nil 
    } 

    self.title = title 
    self.author = author 
    self.price = price 
    self.pubDate = pubDate 
} 

}

Моя ошибка говорит Initializer для условной привязки должен иметь вариант типа не «Строка» Мой вопрос, почему я получаю эта ошибка, если я правильно понимаю инструкцию охраны, я должен передавать только свойства, не связанные с необязательным, перед else, а после фигурных скобок - необязательные, например, я сделал это.

+1

Ваш метод 'init?' Не принимает никаких необязательных аргументов. - Возможно, вы имели в виду 'init? (Title: String ?, author: String ?, ...)'? –

+0

только цена и pubDate являются опциями в моей структуре. Добавление 'price: String ?, pubDate: String?) {...' не исправило мою ошибку. –

+0

Я смущен - при каких обстоятельствах ваш инициализатор терпит неудачу? Вы не можете использовать 'if let' или' guard let' с непараллельными. – Hamish

ответ

0

Предположим, вы отказались от неиспользуемых инициализации. Ваша структура содержит 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") 
+0

Последний пример, работает по назначению. Благодаря! –

0

Вы можете использовать защиту только для необязательных переменных для разворачивания ожидаемых данных или раннего возврата из функции или циклов. Также вам не нужно делать все параметры необязательными. Есть и другие причины, которые могут привести к сбою инициализации.

 Смежные вопросы

  • Нет связанных вопросов^_^