(Swift — ООП) Как преобразовать класс, созданный в Swift (VC1), в Objective C (VC2), в Swift (VC3)

#objective-c #swift #oop #segue

#objective-c #swift #ооп #segue

Вопрос:

Я всего лишь новичок в swift, и я пытаюсь выполнить стиль ООП, создав класс, а затем установив его свойства в:

 @objc class Person: NSObject{

var firstName: String = ""

public func getFirstName() ->String
{
    return firstName
}

public func setFirstName(name: String)
{
    firstname = name
}}
  

Я использовал боковое меню из AppCoda, его кодировка в objective-c. Каким-то образом я смог заставить его работать. Однако теперь я создал контроллер swift для входа в систему (VC1), и я хочу передать данные, которые я получил из php, сохранить их в созданном классе (Person), затем передать Person в этот класс objective C (VC2), затем использовать Person из VC2 в другой созданный мной контроллер swift, (VC3). Можете ли вы предоставить пример кода для передачи классов из swift в objective c другому swift?

Спасибо!

Что я пробовал:

VC1: // часть перехода

 var personClass = Person()
personClass.setFirstName(name: "Sample")
let DestinationViewController:LetsTry = segue.destination as! LetsTry
DestinationViewController.personClass = personClass
  

VC2: (Я действительно не знаю, как objective-c, но некоторые руководства из других сообщений, которые я не очень понимаю)

//заголовочный файл objective-c

 @interface LetsTry : NSObject
@property (strong, nonatomic) id firstName;
- (void) someMethod;
@end
  

VC3:

//didload

 var personClass = Person()
personClass = LetsTry() as! Person

textbox1.text = personClass.getFirstName()
  

Затем он выдает мне, что вы не можете назначить «Person» для ввода «Давайте попробуем»

Комментарии:

1. Пожалуйста, покажите, что вы пробовали, мы не собираемся делать вашу работу за вас.

2. Отредактировано @BenjaminLowry

3. Хорошо, просто подведем итог. У вас есть UIViewController , ваш LoginViewController. В этом ViewController вы создаете Person объект. Тогда у вас есть свой LetsTry класс? Предполагается, что это ваш VC2, которому вы хотели бы передать свой Person ? (потому что в вашем коде это просто подкласс «нормального» NSObject , а не a UIViewController ). И, наконец, как VC3 определяется? Это a UIViewController ? (кажется, так)

4. Привет @pbodsk, да. Мой VC1 является logincontroller, класс ‘Person’ создается и заполняется в этом классе. Я хочу передать этот класс в класс objective-c (VC2), затем я хочу, чтобы VC2 передал его в VC3 с именем ‘homecontroller’, который является swift. Используя segue или другие решения, которые вы можете предложить: D

5. Прямо сейчас я сделал класс ‘Person’, его свойства и методы статическими, чтобы к нему можно было получить доступ с помощью VC3, но я думаю, что это не было бы ООП, если бы оно было статичным.

Ответ №1:

Мне все еще не совсем ясно, что вы пытаетесь здесь сделать, и поэтому этот ответ может быть неправильным.

But…as Я прочитал это, у вас есть два UIViewController s, один вызываемый LoginViewController и другой вызываемый HomeController , между которыми у вас есть свой LetsTry класс, который является классом ObjC, и теперь вы хотели бы, чтобы ваш Person объект передавался из LoginViewController в HomeController , добавляя его в качестве свойства к вашему LetsTry классу.

Для этого вы должны добавить свое Person свойство as LetsTry следующим образом:

 #import "Person.h" <-- don't quote me on this one, maybe it isn't needed

@interface LetsTry : NSObject
    @property (strong, nonatomic) id firstName;
    @property (strong, nonatomic) Person *person;
    - (void) someMethod;
@end
  

Далее ваш переход должен идти от LoginViewController к HomeController , что означает, что destination ваш segue экземпляр должен быть экземпляром HomeController . Кроме того, HomeController должен быть экземпляр LetsTry , подобный этому:

 var letsTry: LetsTry?
  

Теперь мы готовы начать связывать вещи вместе.

Сначала вам нужно добавить свой Person к вашему LetsTry в segue, поэтому вместо этого (который вообще не работает :))

 var personClass = Person()
personClass.setFirstName(name: "Sample")
let DestinationViewController:LetsTry = segue.destination as! LetsTry
DestinationViewController.personClass = personClass
  

Вы бы сделали что-то вроде:

 var personClass = Person()
personClass.setFirstName(name: "Sample")
var letsTry = LetsTry()
letsTry.person = person

if let destinationViewController: HomeController = segue.destination as? HomeController {
    destinationViewController.letsTry = letsTry
}
  

И, наконец, в вашем HomeController вместо:

 var personClass = Person()
personClass = LetsTry() as! Person

textbox1.text = personClass.getFirstName()
  

Вы бы сделали:

 if let letsTry = letsTry {
    textbox1.text = letsTry.person.getFirstName()
}
  

Встречный вопрос 🙂

Когда вы посмотрите на вышесказанное, вы можете начать задаваться вопросом, нужен ли вам этот LetsTry класс вообще. Вы могли бы просто использовать Person класс в своем HomeController . Но у вас, вероятно, есть причина делать то, что вы делаете.

Что следует учитывать

Ваш Person класс кажется немного «Java-esque», или, может быть, C #. Вам не нужны методы get and set , вы можете просто сразу использовать var . Это означает, что вы можете написать свой Person подобный:

 @objc class Person: NSObject{
    var firstName: String = ""
}
  

И использовать его следующим образом:

 var person = Person()
var person.firstName = "Peter"

print(person.firstName) //gives me "Peter"
  

Надеюсь, это вам как-то поможет. Возможно, вы захотите прочитать о переходах, попробуйте взглянуть на учебные пособия по адресу http://raywenderlich.com например

Комментарии:

1. Привет @pbodsk, кстати, класс ‘Person’ — это другой файл swift (не контроллер, а просто класс). Теперь моя проблема в том, что если я помещу предложенный вами код «@interface LetsTry : NSObject …..» в класс objective-c с расширением .h, он не сможет найти класс ‘Person’. С другой стороны, если я помещу его в класс objective-c с расширением .m, теперь он может получить доступ к классу ‘Person’ из swift однако мои контроллеры swift не смогли найти класс ‘LetsTry’ из этого класса objective-c с расширением .m . Какие-либо решения?

2. о, добавление @class Person; в дополнение к реализации сработало, теперь попробую ваше предложение.

3. Здравствуйте, итак, теперь есть ошибка времени сборки с кодом: var personClass = Person() personClass.setFirstName(name: «Sample») var letsTry = LetsTry() letsTry.person = person В нем говорится: -«_OBJC_CLASS_ $ _LetsTry», ссылка из: -команда компоновщика завершилась ошибкой с кодом выхода 1(используйте -v, чтобы увидеть вызов)

4. У меня нет никаких ответов на этот вопрос, извините: (Но из головы. Добавили ли вы в свой проект файл «связующего заголовка»? Взгляните на этот документ developer.apple.com/library/content/documentation/Swift / … особенно раздел «Импортировать код Swift в Objective-C из той же цели»

5. о, мне пришлось добавить @implementation в файл .m