SwiftでObjective Cクラスを初期化しようとしていますが、予期しない結果が出ています。プロパティはすべて文字列であり、初期化中にインラインで設定されます。新しいオブジェクトを使用しようとすると、プロパティは設定したものではなく、任意の値を指しているように見えます(私が推測しているのは、それらが指しているメモリの場所にあるものをピックアップしていることだけです)。ここで私が持っているものです。SwiftのObjective-Cクラスのプロパティを初期化すると、予期しない値とタイプが発生する
MTUserInfo.h
は#import <Foundation/Foundation.h>
@interface MTUserInfo : NSObject
@property (nonatomic, readonly, assign) NSString* firstName;
@property (nonatomic, readonly, assign) NSString* lastName;
@property (nonatomic, readonly, assign) NSString* userEmail;
@property (nonatomic, readonly, assign) NSString* userPhone;
- (instancetype)initWithFirstName:(NSString*)firstName
lastName:(NSString*)lastName
userEmail:(NSString*)userEmail
userPhone:(NSString*)userPhone;
@end
MTUserInfo.m
#import "MTUserInfo.h"
@implementation MTUserInfo
- (instancetype)initWithFirstName:(NSString *)firstName
lastName:(NSString *)lastName
userEmail:(NSString *)userEmail
userPhone:(NSString *)userPhone
{
self = [super init];
if (self) {
_firstName = firstName;
_lastName = lastName;
_userEmail = userEmail;
_userPhone = userPhone;
}
return self;
}
@end
かつ迅速で、私の簡単なビューコントローラ:
import UIKit
class ViewController: UIViewController {
var userInfo: MTUserInfo
required init?(coder aDecoder: NSCoder) {
userInfo = MTUserInfo(firstName: "Firstname",
lastName: "Lastname",
userEmail: "[email protected]",
userPhone: "555-555-4433")
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("User info: ", self.userInfo.firstName)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
何が起こっているのか、それを修正する方法についてのアイデアはありますか?私はここに迷っている。
Btw、これは単純化された例です。私の実際のアプリではObjective-Cクラスを制御できません。ライブラリとしてインポートされます。
私はあなたが 'でsuper.init(aDecoderコーダ)を呼び出すされるべきだと思います。 'userInfo'を暗黙的にアンラップした' var userInfo:MTUserInfo'に、あなたが受け取るエラーを処理するようにマークすることができます。 –
アレン、ポインタありがとう。残念ながら、それは私が得ている問題に影響しません。イベントをローカル変数に更新すると、メモリ内の任意の場所を指すようになります。 –
問題はこれらのプロパティが割り当てられていることです。つまり、ARCはそれらのプロパティを保持していません。 –