【问题标题】:Initializer element is not a compile time constantInitializer 元素不是编译时常量
【发布时间】:2014-08-04 04:40:22
【问题描述】:

使用objective-c编写程序。我收到一个错误(初始化元素不是编译时常量),我不确定我是否理解它发生的原因。我只是想初始化一个数组。我也在使用xcode6。我的问题是:如何在 Objective-c 中正确地重写它,在新的 Swift 中它会是什么样子?另外为什么会出现错误 - 我不了解如何在这个问题上实现其他一些线程?

名称.h

#import <Foundation/Foundation.h>

@interface Name : NSObject
@property (nonatomic, retain) NSMutableArray *myArray;

@end

名字.m

#import "Name.h"

@implementation Name

NSMutableArray *myArray = [[NSMutableArray alloc] init]; //error shows up here - initializer element is not a compile-time constant

[myArray addObject:@"Object 1"];

[myArray addObject:@"Object 2"];

[myArray addObject:@"Object 3"];

@end

【问题讨论】:

  • 请一次提出一个问题。此外,如果您想将其翻译成 swift,请继续尝试自己。如果您有问题,请来这里提出具体问题。
  • 这是对您对已删除问题的评论的回应:stackoverflow.com/q/24252665/365496。是的,uniform_real_distributionmt19937 引擎结合起来应该非常统一。另请注意,使用&lt;random&gt; 库时,您不需要使用srand() 进行种子设定。初始化引擎(mt19937)就足够了。

标签: objective-c


【解决方案1】:

你应该只在方法中初始化变量

尝试覆盖

 -(id) init
 {
  self = [super init];
  if(self)
  {
    myArray = [[NSMutableArray alloc] init];
  }
  return self;
 }

【讨论】:

  • addObject 方法应该放在哪里?
  • NSMutableArray *myArray = @[@"Object 1",@"Object 2",@"Object 3"];
  • 这是在init方法之后吗?
  • 抱歉,最后一条评论不正确,因为它返回的是 NSArray 而不是 NSMutableArray - 因此,如果这是您的意图,您将无法在之后添加更多对象。你应该调用 [myArray addObject:@"Object 1"]; [myArray addObject:@"对象 2"]; [myArray addObject:@"对象 3"];在初始化调用之后。即在 init 方法中
  • 我在 alloc init 行收到一条错误消息“预期标识符”。 -(id) 初始化 { self = [超级初始化]; if(self) { NSMutableArray *myArray = [[[NSMutableArray alloc] init]; [myArray addObject:@"对象 1"]; [myArray addObject:@"对象 2"]; [myArray addObject:@"对象 3"]; } 返回自我;
【解决方案2】:

错误

正如错误所说,您只能在类的实现中初始化编译时间常量

这将起作用:

NSString* abcd = @"test";

因为@"test" 是一个常量,在你的代码编译后永远不会改变。

[[NSMutableArray alloc] init] 不是一个常数,这就是你得到错误的原因。你必须实现一个init 方法来初始化你的数组。

斯威夫特

对于您问题的快速部分:

您仍然可以在 swift 中使用 NSArray 或使用 swift Array 类型。 您可以查看Working with Cocoa Data Types DocumentationApple collections types Swift Documentation

如果你还想在 swift 中使用 NSArray:

var array:NSMutableArray = NSMutableArray()
array.addObject("test1")
array.addObject("test2")
// or
array:NSMutableArray = ["test1", "test2"]

或者如果你想使用 swift 数组:

var array:String[] = ["test1", "test2"]
// or
var array:String[] = String[]()
array.append("test1")
array.append("test2")

【讨论】:

  • 感谢非常有帮助...它如何知道数组不是常量并且会在编译后更改?在初始代码中我只是使用字符串?
  • alloc 和 init 是 NSMutableArray 类的方法。编译器在代码执行期间调用它们之前无法知道这些方法将返回什么。编译器不可能知道方法在编译时返回什么。
【解决方案3】:

尝试将“Building Settings”->“Compile Sources As”编辑为“Objective-C++”,也许可以解决您的问题。

【讨论】:

  • 为我工作!谢谢
猜你喜欢
  • 2022-01-10
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2011-09-02
  • 2014-02-18
相关资源
最近更新 更多