繁体   English   中英

如何在objective-c中初始化对象数组,类似于swift

[英]How to init array of objects in objective-c, similar to swift

我是新的 iOS 开发人员。 我开始学习 Swift,但我想切换到 Objective-C。 下面是我在 Swift 中使用的代码

我有Player.swift

import Foundation
import UIKit

struct Player {
    var name: String!
    var game: String!
    var rating: Int

    init(name:String?, game:String?, rating:Int) {
        self.name = name
        self.game = game
        self.rating = rating
    }
}

我有一个类存储数据 Player 对象数据,并且该数据在项目中随处使用:

import Foundation
let playerData = [
    Player(name: "Bill Evan", game: "call of duty", rating: 4),
    Player(name: "Linh Nguyen", game: "Alien vs predator", rating: 3)
]

我的问题是如何在 Objective-C 中做到这一点:

我试图在Player.h做到这Player.h

#import <Foundation/Foundation.h>

@interface Player : NSObject

@property(nonatomic, strong) NSString *name;
@property(nonatomic, strong) NSString *game;
@property int rating;

-(id)initWithPlayer:(NSString *)name
               game:(NSString*)game
             rating:(int)rat;

@end

Player.m

#import "Player.h"

@implementation Player

-(id)initWithPlayer:(NSString *)name game:(NSString *)game rating:(int)rating {
    self.name = name;
    self.game = game;
    self.rating = rating;
    return self;
}
@end

如何创建存储许多玩家对象的 Player 对象数组?

受到推崇的:

使用类型化数组NSArray<Player *>以便您在访问它时不必NSArray<Player *>转换元素,如果您尝试插入非Player对象,编译器会警告您。

NSArray<Player *> *players = @[
    [[Player alloc] initWithPlayer:@"Steven" game:@"Pokémon Go" rating:100],
    [[Player alloc] initWithPlayer:@"Mike" game:@"Pokémon Silver" rating:90]
];

Player *steven = players[0];
steven.rating = steven.rating + 1;

不建议:

如果你只是这样做

NSArray *players = @[ ... see above ... ];

你必须像这样投

Player *steven = (Player *)players[0];

这也更危险,因为编译器也允许你这样做:

NSArray *players = @[
    [[Player alloc] initWithPlayer:@"Steven" game:@"Pokémon Go" rating:100],
    @"Just a String, not a Player object"
];

当您将@"Just a String, ..."对象 ( players[1] ) 转换为 Player 对象时,这显然会导致运行时崩溃。

要回答这个问题,您可以使用以下两种方法之一在 Objective-C / Foundation 中初始化对象数组:

// Original, longer way of doing it
NSArray *words = [NSArray arrayWithObjects:@"list", @"of", @"words"];

// Modern Objective-C shorthand
NSArray *words = @[@"list", @"of", @"words"];

有点冗长,但考虑到您的对象,以下是您的 Swift 代码:

let playerData = [
    Player(name: "Bill Evan", game: "Call of Duty", rating: 4),
    Player(name: "Linh Nguyen", game: "Alien vs. Predator", rating: 3)
]

会在Objective-C中查看:

NSArray *playerData = @[
    [[Player alloc] initWithPlayer:@"Bill Evan" game:@"Call of Duty" rating:4],
    [[Player alloc] initWithPlayer:@"Linh Nguyen" game:@"Alien vs. Predator" rating:3]
];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM