iOS / Swift: простой способ объявить переменную или свойство в NSObject - PullRequest
0 голосов
/ 31 мая 2018

Новичок в Swift, я создал класс NSObject, item.h в отдельном файле для отслеживания своих предметов.Каждый предмет имеет разные свойства.

В Objective-C я бы просто объявил свойства как

@property(nonatomic) NSString *name; и т. Д. В файле интерфейса.

Я попытался создать нечто подобное вСвифт так:

import UIKit

class item: NSObject {
    var topSpeed: Double
    var aStrProperty: String
    var anIntProperty: Int
}

Однако я получаю error: Class 'item' has no initializer.В документах Apple они, похоже, предлагают создать структуру, но я надеялся, что NSObject будет объектом для моих предметов, как я обычно делал в Objective-C

Буду признателен, если кто-то сможет объяснитьправильный способ дать моим объектам свойства.

Заранее благодарим за любые предложения.

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

В Swift все свойства должны иметь значение при инициализации.В настоящее время вы не указали значения свойств.

Почему бы не прослушать, что говорит ошибка, и добавить инициализатор?

class item: NSObject {
    var topSpeed: Double
    var aStrProperty: String
    var anIntProperty: Int

    init(topSpeed: Double, aStrProperty: String, anIntProperty: Int) {
        self.topSpeed = topSpeed
        self.aStrProperty = aStrProperty
        self.anIntProperty = anIntProperty
    }
}

В качестве альтернативы, вы можете добавить ! или ?, чтобы сделать их опциональными.Таким образом, вы делаете начальные значения всех свойств равными nil.

var topSpeed: Double!
var aStrProperty: String!
var anIntProperty: Int!
0 голосов
/ 31 мая 2018

Вы должны иметь некоторые значения по умолчанию для ваших свойств.Есть несколько способов добиться этого.Либо вы создаете как предложенный метод init для назначения этих значений по умолчанию.

class item: NSObject {
    var topSpeed: Double
    var aStrProperty: String
    var anIntProperty: Int

    override init() {
        topSpeed = 120.0
        aStrProperty = "aStrValue"
        anIntProperty = 1
    }
}

Вы также можете напрямую назначать значения в классе.

class item: NSObject {
    var topSpeed: Double = 120.0
    var aStrProperty: String = "aStrValue"
    var anIntProperty: Int = 1
}

Или пометить ваши свойства как необязательные,Затем вы должны развернуть каждое свойство, когда используете их.

class item: NSObject {
    var topSpeed: Double?
    var aStrProperty: String?
    var anIntProperty: Int?
}

Если бы вы использовали struct.Метод init создается автоматически для вас.

0 голосов
/ 31 мая 2018

Свойства в вашем классе не объявлены как необязательные (поэтому не могут быть nil) и не имеют начального значения.Таким образом, в инициализаторе вы должны дать этим свойствам значение.

Если бы вы использовали структуру вместо класса, вы бы автоматически получили метод инициализатора:

struct Item {
    var topSpeed: Double
    var aStrProperty: String
    var anIntProperty: Int
}

let item = Item(topSpeed: 200, aStrProperty: "Car", anIntProperty: 2)

Но с классом вам потребуется реализовать это самостоятельно:

class Item: NSObject {
    var topSpeed: Double
    var aStrProperty: String
    var anIntProperty: Int

    init(speed: Double, str: String, int: Int) {
        topSpeed = speed
        aStrProperty = str
        anIntProperty = int

        super.init()
    }
}

let item = Item(speed: 200, str: "Car", int: 2)

Вы должны использовать Structs везде, где это возможно, прочитайте документацию здесь для объяснения каждого из них.

0 голосов
/ 31 мая 2018

если вы хотите опустить метод init, тогда у вашего свойства должно быть значение по умолчанию, или они должны быть необязательными.

Если вы не хотите его использовать, вы должны создать требуемый метод init для инициализации всех свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...