【问题标题】:How to init array of objects in objective-c, similar to swift如何在objective-c中初始化对象数组,类似于swift
【发布时间】:2017-02-15 00:04:36
【问题描述】:

我是新的 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
    }
}

我有一个类存储数据播放器对象数据,并且该数据在项目中无处不在:

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 中执行此操作:

#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

如何创建播放器对象数组存储多个播放器对象?

【问题讨论】:

  • 你要语法吗?
  • 您应该在init 方法中使用instancetype 而不是id

标签: ios objective-c arrays swift


【解决方案1】:

推荐:

使用类型化数组NSArray&lt;Player *&gt;,这样您在访问它时就不必强制转换元素,如果您尝试插入非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 对象时,这显然会导致运行时崩溃。

【讨论】:

  • 哦,非常感谢@MarkHim。我只是ios开发的初学者:)
  • 一件事,如果我创建存储这个数组的类并在我的应用程序的任何地方使用它。这堂课怎么样?谢谢!
  • 我不确定我是否理解正确,但使用#import 您可以将类头导入其他目标 c 文件。只需在任何其他objective-c .h 或.m 文件中执行#import "Players.h"
  • 这个答案很简洁。
  • @MarkHim 很抱歉,我的问题是错误的。 :) 谢谢!
【解决方案2】:

要回答这个问题,您可以使用以下两种方法之一在 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]
];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2011-09-08
    • 2013-07-06
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多