#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
, а не aUIViewController
). И, наконец, какVC3
определяется? Это aUIViewController
? (кажется, так)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