Я пытаюсь преобразовать класс Java для Swift:Новый Свифта - failable инициализаторах
// Card class with only a main function
public class Card {
// fields
private int numvalue;
// constructor(s)
public Card(int v) {
if (v > 0 && v < 11) {
this.numvalue = v;}
else {
System.out.println("Error: Card value is outside the allowed range.
Value must be between 1 and 10 inclusive.")
}
Если я пытаюсь инициализировать объект карты с помощью конструктора со значением, которое не от 1 до 10, инициализация завершается неудачно, и в терминале печатается заявление, объясняющее, что значение не было в допустимом диапазоне. Я попытался воссоздать это в Свифт.
class Card {
var numValue : Int?
init(numValue:Int) {
if (numValue > 0 && numValue < 11) {self.numValue = numValue}
else {print("Card value must be between 0 and 11")}
}
func setNumValue(value:Int) ->() {
self.numValue = value
}
func getNumValue() -> Int {
return self.numValue!
}
}
Вышеуказанные работы в соответствующих случаях, но, как представляется, по-прежнему создает экземпляр карты, даже если передаются неприемлемое значение, потому что я все еще могу использовать setNumValue (значение :) метод для изменения значения.
Я попытался сделать инициализацию (метод numvalue :) неудачной, но затем я получу опцию (Карту), если инициализация прошла успешно. В идеале я бы хотел, чтобы любой успешно инициализированный объект Карты был объектом Карты, а не Факультативным, содержащим Карту. Это возможно?
Ваш класс Java Безразлично 't fai l для инициализации, если вы вводите недопустимый номер, он просто не устанавливает 'numvalue'. Вы все равно получите экземпляр «Card» от конструктора. В Swift вы захотите условно развернуть * по желанию, вы вернетесь из неисправного инициализатора, чтобы узнать, успешно ли это или нет. Я настоятельно рекомендую прочитать раздел [optionsals руководства по языку] (https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID330), который охватывает все это очень подробно. – Hamish
@LouisDeVesto Добавить комментарий Хамиша: конструкторы Java не имеют эквивалентной функции для инициализаторов Swift. Вместо этого в Java люди будут использовать статические методы, которые вызывают для вас конструктор, который либо возвращает новый объект, либо «null». – Alexander
Также btw, вы можете проверить, является ли значение в диапазоне более просто: 'if 1 ... 10 ~ = numValue {...' – Alexander