1

为什么这行得通:

let formFescriptor = XLFormDescriptor(title: "Sign Up");

和这个:

let formFescriptor = XLFormDescriptor(title: NSLocalizedString("Sign Up", comment: nil));

给我错误:

Cannot invoke initializer for type 'XLFormDescriptor' with an argument list of type '(title: String)'

为什么?

4

2 回答 2

3

NSLocalizedString 具有非可选注释,而您将 nil 传递给它。将注释更改为在上下文中有意义的内容,因此 NSLocalizedString 以及 XLFormDescriptor 将被正确初始化。

于 2015-08-07T22:17:13.703 回答
3

Ib Objective-CNSLocalizedString是一个宏定义在NSBundle.h

#define NSLocalizedString(key, comment) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

在 Swift 中,它是一个函数:

func NSLocalizedString(key: String, tableName: String? = default, bundle: NSBundle = default, value: String = default, #comment: String) -> String

您可以将其用作:

let title = NSLocalizedString("Sign Up", tableName: nil, bundle: NSBundle.mainBundle(), value: "", comment: "")
let formDescriptor = XLFormDescriptor(title: title)

或者您可以使用从宏调用的等效代码:

let title = NSBundle.mainBundle().localizedStringForKey("Sign Up", value: nil, table: nil)
let formDescriptor = XLFormDescriptor(title: title)

另一个好主意是向String类添加一个很好的方法来获得很好的语法。这是这个答案的一个例子:

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: NSBundle.mainBundle(), value: "", comment: "")
    }
}

然后像这样使用它:

let formDescriptor = XLFormDescriptor(title: "Sign Up".localized)
于 2015-08-07T22:26:03.453 回答