2015-10-21 31 views
-4

之前调用setObject需要“forKey:”当我在NSUserDefaults上调用setObject时,它需要编译前需要forKey:。但是,在例如objectForKey等其他方法之前我不需要任何东西。这是为什么?在Swift中,NSUserDefaults为什么在第二个参数

这工作: NSUserDefaults.standardUserDefaults().setObject(myString, forKey: "myString") 这不: NSUserDefaults.standardUserDefaults().setObject(myString, "myString")

这不需要XXX:在第一个参数前: NSUserDefaults.standardUserDefaults().objectForKey("myString")

一个人如何知道什么时候供应在参数前添加xxx和冒号?除了依靠Xcode的自动完成或编译器错误吗?

+0

苹果有非常好的swift文档。请参考:https://developer.apple.com/library/watchos/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-ID166 – ngoa

回答

1

当我在NSUserDefaults上调用setObject时,它需要一个forKey:才能编译。但是在像objectForKey这样的其他方法之前,我不需要任何东西。这是为什么?

Objective-C的方法是:

-setObject:forKey: 

它需要两个参数 - 对象,和密钥。另一方面,objectForKey:只接受一个参数(键)并返回一个对象。

如何知道何时在参数前提供前缀xxx和冒号?除了依靠Xcode的自动完成或编译器错误吗?

你需要知道你在调用什么方法。你可以看看。例如,文档NSUserDefaults的提供雨燕原型需要的方法:

func setObject(_ value: AnyObject?, 
    forKey defaultName: String) 

或者,如果你碰巧知道Objective-C的原型

- (void)setObject:(id)value 
     forKey:(NSString *)defaultName 

它并不需要很长时间来获得在你头上转换的窍门。

+0

我想我可能需要一些澄清关于如何阅读文档语法。看看'func setObject(_ value:AnyObject ?, forKey defaultName:String)'中的第二个参数'我看到: 'String'是 'defaultName'是变量的名字? 'forKey'是? –

+0

'forKey'是方法名称的一部分。如果你来自Java或C,那么参数只是简单列出来的,我相信这看起来很奇怪。在Objective-C中,参数分散在方法名称的各个部分之间,这使得很容易记住哪个参数在哪里。 '颜色(10,15,20)'不会告诉你哪个数字是哪个; 'colorWithRed:10绿色:15蓝色:20'。所以这个想法延续到了Swift中。给它时间,如果它看起来很奇怪 - 这是一个相当不错的约定。 – Caleb

+0

好的。你是对的,我主要是Java开发人员。前缀用红色,绿色,蓝色看起来很棒。我想我只是感到困惑,因为第一个参数并不总是这样,这让我相信有一些深奥的规则,我不知道后面哪个参数需要它,哪些参数不需要。 –

0

的方法/函数签名,它是开口括号

  • 逗号和结肠(包括逗号和结肠)之间的所有内容
  • 之前

    • 一切总是必需的。

    1

    在swift函数中,不需要第一个参数标签(除了init方法)。所以如果一个函数只有一个参数,你不需要指定参数标签。这是objectForKey:没有任何标签的原因。 setObject:forKey:需要两个参数,所以第二个参数需要一个标签。

    默认情况下,第一个参数省略其外部名称,以及 第二次及以后的参数使用其本地的名字作为自己 外部名称。所有参数必须具有唯一的本地名称。尽管 多个参数可能具有相同的外部名称,但是唯一的外部名称有助于使代码更具可读性。

    参考:Swift Documentation

    1

    如果我理解正确你的问题, 通常你并不需要传递一个参数传递给函数时,包括第一个参数名称。

    func someFunction(firstParameterName: Int, secondParameterName: Int) { 
        // function body goes here 
        // firstParameterName and secondParameterName refer to 
        // the argument values for the first and second parameters 
    } 
    someFunction(1, secondParameterName: 2) 
    

    默认情况下,第一个参数省略其外部名称,以及 第二次及以后的参数使用其本地的名字作为自己 外部名称。所有参数必须具有唯一的本地名称。尽管 多个参数可能具有相同的外部名称,但是唯一的外部名称有助于使代码更具可读性。

    希望这会有所帮助。 你可以在这里阅读更多关于它: Function Parameter Naming in Swift

    +0

    这确实有帮助。你提供的文档链接也有帮助。谢谢! –

    相关问题