当前位置:  开发笔记 > IOS > 正文

快速语言中'#'标记的含义是什么?

如何解决《快速语言中'#'标记的含义是什么?》经验,为你挑选了2个好方法。

我见过这样的代码:

func hello(name: String, #helloMessage: String) -> String { 
    return "\(helloMessage), \(name)." 
} 

我的问题是#参数名称之前的标记是什么意思?这是否意味着在调用函数时必须指定参数?

此外,任何人都可以告诉我没有这个#标记的功能吗?代码示例非常受欢迎.



1> ovejka..:

更新(Swift 3.*...)

第一个参数的签名的默认行为发生了巨大变化.要了解参数标签(例如"外部参数")和参数名称(例如"本地参数")如何工作,请阅读Apple的Swift-book中的"函数参数标签和参数名称"一章.

一些例子:

func someFunction(parameterName: Int) { parameterName }
someFunction(parameterName: 5) // argument label not specified

func someFunction(argumentLabel parameterName: Int) { parameterName }
someFunction(argumentLabel: 5) // argument label specified

func someFunction(_ parameterName: Int) { parameterName }
someFunction(5) // argument label omitted

方法和函数之间的这种行为没有区别.


更新(斯威夫特2.*)

不推荐使用下面描述的功能,需要两次写入参数名称以获得与之前的哈希符号相同的行为.


更新(示例)

对于函数:当调用函数并且某些参数的目的不明确时,为这些参数提供外部名称.

func someFunction(parameterName: Int) { parameterName }
someFunction(5) // What is the meaning of "5"? 

func someFunction(externalParameterName parameterName: Int) { parameterName }
someFunction(externalParameterName: 5) // Now it's clear.

但是,如果外部名称和本地名称相同,则只需在参数名称前写入哈希符号.

func someFunction(#parameterName: Int) { parameterName }
// It's actually like:
// func someFunction(parameterName parameterName: Int) { parameterName }
someFunction(parameterName: 5)

对于方法:默认情况下,第一个参数名称仅为本地(如函数),但第二个和后续参数名称都是本地和外部的(就像在参数名称之前编写哈希符号一样,此#隐式存在):

class SomeClass {
    func someMethodWith(firstParameter: Int, andSecondParameter: Int) { ... }
}
SomeClass().someMethodWith(5, andSecondParameter: 10)

您也可以使用#(或添加显式外部名称)作为方法的第一个参数,但它不符合Objective-C样式的调用.

class SomeClass {
    func someMethodWith(#firstParameter: Int, andSecondParameter: Int) { ... }
}
SomeClass().someMethodWith(firstParameter: 5, andSecondParameter: 10)

原始答案

如果要为函数参数提供外部参数名称,并且本地参数名称已经是要使用的适当名称,则不需要为该参数两次写入相同的名称.相反,写一次名称,并在名称前加上一个井号(#).这告诉Swift将该名称用作本地参数名称和外部参数名称.

摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itunes.apple.com/ru/book/swift-programming-language/id881256329?l=en&mt=11


对于初始化器,`#`隐式存在于所有参数中.
对于方法,它从第二个参数开始自动执行此操作.

2> ayaio..:

这在Swift 2中有所改变:

现在,您可以在内部参数名称之前指定外部参数名称,而不是使用#强制现有名称.


根据约定,方法名称包含动作动词,并且在调用方法时未指定第一个参数:

func sayHiFrom(sender: String, to: String) {
    print("Hi from \(sender) to \(to)!")
}

sayHiFrom("Jules", to: "Jim")

指定内部参数名称

这次第二个参数在方法内使用的名称不同,而不更改外部名称.当参数有两个名称时,第一个是外部的,第二个是内部的:

func sayHiFrom(sender: String, to receiver: String) {
    print("Hi from \(sender) to \(receiver)!")
}

sayHiFrom("Jane", to: "John")

强制外部参数名称

您可以强制第一个参数具有外部名称:

func sayHi(from sender: String, to receiver: String) {
    print("Hi from \(sender) to \(receiver)!")
}

sayHi(from: "Joe", to: "Jack")

在这种情况下,方法名称最好不包含操作术语,因为强制参数名称已经起作用.

强制没有外部参数名称

您还可以通过在_(下划线)前面删除其他参数的参数名称:

func sayHi(sender: String, _ receiver: String) {
    print("Hi from \(sender) to \(receiver)!")
}

sayHi("Janice", "James")


@JulianKról不完全,我正在按照仍然使用#的教程.这个页面给了我答案,为什么不接受这个.
推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有