我有一个xcode项目有2个类 - Stem&玩家,我试图从面向对象的角度确保我的代码是可靠的,我相信我的Player类可以接受我的Stem类中的信息。
我想从stem中的数组访问索引 - 我可以使用
从我的视图控制器执行此操作stem.index[i]
当我尝试从玩家那里做这件事时我不被允许,因为干是未宣布的。我已经尝试将Stem.h导入我的Player.m文件&在播放器中声明词干(类似于在视图控制器中如何做到这一点),只是为了获得错误(在'Stem'之前预期的说明符 - 限定符列表)。
这样做的正确方法是什么?请原谅任何松散的术语,因为我对此比较陌生。在此先感谢:)
修改
这里有一些代码可能会对事物有所了解,在viewController中我声明了干和&播放器
#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>
#import "Stem.h"
#import "Player.h"
@interface TestApp_v1ViewController : UIViewController {
Stem *stem;
Player *player;
我分配&amp;初始化我的两个对象干&amp; viewController.m中的播放器
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"Init Successful");
[self loadMOV];
[self setupInterface];
stem = [[Stem alloc] init];
player = [[Player alloc] init];
}
然后我转到Stem.h,我再次声明词干(这样当stem.h导入到player.h时,玩家可以访问词干 - 根据glogic的评论)
#import <Foundation/Foundation.h>
@interface Stem : NSObject {
int *index;
int numberOfStems;
Stem *stem;
}
@property(nonatomic,readwrite) int *index;
@property(nonatomic, retain) Stem *stem;
Player.h看起来像这样:
// Player.h
#import <Foundation/Foundation.h>
#import "Stem.h"
@interface Player : NSObject {
NSMutableArray *player1;
}
@property(nonatomic,retain) NSMutableArray *player1;
-(void) playAudio;
@end
最后在Player.m中我尝试访问索引数组
#import "Player.h"
@implementation Player
@synthesize player1;
-(void)playAudio {
NSLog(@"play audio called");
NSLog(@"index[0] is: %i", stem.index[0]);
}
@end
我仍然被告知词干是未宣布的,有什么想法吗?
编辑#2 - 添加裸机程序
我希望这被认为是好的,但我决定发布我的程序(简化为基本要素)。我认为这可能是解决问题的唯一方法 - 因为很多课程都在进行。我一直试图让这个工作几个小时,现在......#/ p>
我分配了&amp;初步化我的干&amp; viewController中的播放器对象 - 我认为这是解决此问题的最佳方法,但也许有更好的方法。
//Part (i)
// TestApp_v1ViewController.h
#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>
#import "Stem.h"
#import "Player.h"
@interface TestApp_v1ViewController : UIViewController {
Stem *stem;
Player *player;
}
@property(nonatomic, retain) Stem *stem;
@property(nonatomic, retain) Player *player;
@end
//Part (ii)
// TestApp_v1ViewController.m
#import "TestApp_v1ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@implementation TestApp_v1ViewController
@synthesize stem;
@synthesize player;
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"Init Successful");
stem = [[Stem alloc] init];
[stem loadURLs];
player = [[Player alloc] init];
[player playAudio];
int index = stem.value;
NSLog(@"r is: %i", index); //checking to see if I can get a value from the index array - this works fine, so 'value' can be accessed from the viewController
}
这里我宣布一个int数组&amp;我希望稍后从我的播放器访问的int“值”(这就是问题所在)
//Part (iii)
// Stem.h
#import <Foundation/Foundation.h>
@interface Stem : NSObject {
NSMutableArray *urlArray;
int *index;
int value;
int numberOfStems;
Stem *stem;
}
- (void)loadURLs;
- (void)randomiseAudioForInitialPlay;
@property(nonatomic,retain) NSMutableArray *urlArray;
@property(nonatomic,readwrite) int *index;
@property(nonatomic,readwrite) int numberOfStems;
@property(nonatomic,readwrite) int value;
@property(nonatomic, retain) Stem *stem;
@end
//Part (iv)
// Stem.m
#include <stdio.h>
#import "Stem.h"
@implementation Stem
@synthesize numberOfStems;
@synthesize urlArray;
@synthesize index;
@synthesize stem;
@synthesize value;
- (void)loadURLs
{
NSLog(@"Loading URLs");
numberOfStems = 20;
urlArray = [[NSMutableArray alloc] init];
for ( int i = 1; i <= numberOfStems; i++ ) {
NSString *soundName = [NSString stringWithFormat:@"stem-%i", i];
NSString *soundPath = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
NSURL *soundFile = [[NSURL alloc] initFileURLWithPath:soundPath];
[urlArray addObject:soundFile];
[soundFile release];
}
[self randomiseAudioForInitialPlay];
}
- (void)randomiseAudioForInitialPlay
{
index = malloc(numberOfStems*sizeof(int));
for (int i = 0; i < numberOfStems; i++)
{
index[i] = i;
}
for (int i = (numberOfStems - 1); i > 0; i--)
{
int randomIndex = arc4random() % i;
int tmp = index[i];
index[i] = index[randomIndex];
index[randomIndex] = tmp;
}
value = self.index[10]; //this is what needs to be accessed later, from player
NSLog(@"value at index 10 is:%i", value);
}
@end
这里我包含'Stem.h',因为玩家需要使用stem才能返回stem.value
//Part (v)
// Player.h
#import <Foundation/Foundation.h>
#import "Stem.h"
@interface Player : NSObject {
Player *player;
}
@property(nonatomic, retain) Stem *stem;
@property(nonatomic, retain) Player *player;
-(void) playAudio;
@end
这就是出错的地方,我的NSLog语句告诉我,值为0,即使我可以看到它是(例如)14在词干中。编译器也没有错误。
//Part (vi)
// Player.m
#import "Player.h"
@implementation Player
@synthesize player;
@synthesize stem;
-(void)playAudio {
int value = stem.value;
NSLog(@"value is:%i", value );
}
@end
这是我第一次正确参与面向对象的项目,所以我正在学习工作,有关为什么我不能在我的Player类中访问stem.value的任何建议?
我对这样一个程序中的各种对象如何相互影响(以及正确的语法)的想法仍然模糊,所以请原谅我代码中的疯狂n00b错误:)
答案 0 :(得分:3)
你在哪里宣布玩家的干?如果你在player.h中声明它,那么你需要在player.h中导入stem.h而不是player.m。
编辑:是的,它仍然未声明,因为你在视图控制器中声明了干,而不是播放器。嗯这似乎是个不了解的事情。这实际上取决于你的代码实际工作方式
#import Stem.h
@interface Player : NSObject {
NSMutableArray *player1;
}
@property(nonatomic,retain) NSMutableArray *player1;
@property(nonatomic,retain) Stem *stem;
-(void) playAudio;
@end
#
import "Player.h"
@implementation Player
@synthesize player1, stem = _stem;
-(void)playAudio {
NSLog(@"play audio called");
NSLog(@"index[0] is: %i", _stem.index[0]);//stem.index[0] will be a problem here as its not a c array
}
@end
然后在你的控制器
player.stem = stem;
我不知道为什么你在干类中创建一个干指针。
@interface Stem : NSObject {
int *index;
int numberOfStems;
}
@property(nonatomic,readwrite) int *index;
如果它是你想要的一个词干数组,那么在控制器中创建它
编辑:你有行
player = [[Player alloc] init];
[player playAudio];
添加
player.stem = stem;
您必须将播放器中的指针指定给您在视图控制器中创建的词干
答案 1 :(得分:2)
最好的方法是在Stem
类中创建一个方法,如:
value = [stem valueAtIndex:i];
这样就可以减少耦合,并且Stem
类中保存值的方式不会公开,如果需要,可以在以后更改,而不会传播访问调用。