Swift 方法命名问题

Swift 方法命名问题,swift,Swift,我希望创建一个相当于 + (void)insertFileWithService:(GTLServiceDrive *)service title:(NSString *)title 我打字的时候 func insertFileWithService(service: GTLServiceDrive, title title: String, 我得到一个警告标题,标题可以更简洁地表达为#title 但是当我把它改成 func insertFil

我希望创建一个相当于

+ (void)insertFileWithService:(GTLServiceDrive *)service
                    title:(NSString *)title
我打字的时候

func insertFileWithService(service: GTLServiceDrive,
    title title: String,
我得到一个警告标题,标题可以更简洁地表达为#title

但是当我把它改成 func insertFileWithService(服务:GTLServiceDrive, #标题:字符串

我在参数title中得到一个无关的警告“#”,它已经是关键字参数名称


我是否应该忽略这些警告并将其归为Beta版中的错误?

去掉散列标记,只使用“title:String”

Swift允许您在函数内部以不同于外部的方式命名参数

当您希望参数在函数中具有不同的名称时,可以使用这些“外部参数名称”。来源:

有时,在调用函数时命名每个参数很有用,以指示传递给函数的每个参数的用途 功能

如果希望函数用户在调用函数时提供参数名,请为每个函数定义外部参数名 参数,以及本地参数名称

由于您在内部和外部都使用相同的名称(此处为“title”),因此可以按照Swift的建议跳过外部参数名称,并使用
#
前缀表示内部引用的名称相同的命名外部参数

书中的例子:

func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
    for character in string {
        if character == characterToFind {
            return true
        }
    }
    return false
}

我不认为这是一个bug,事实上,这就是语言设计的工作原理:


来自苹果的东西():

此incrementBy方法有两个参数amount和numberOfTimes。默认情况下,Swift仅将amount视为本地名称,但将numberOfTimes视为本地名称和外部名称。您可以按如下方式调用该方法:

您不需要为第一个参数值定义外部参数名,因为它的用途在函数名incrementBy中是明确的。但是,第二个参数由外部参数名限定,以便在调用方法时明确其用途

此默认行为有效地将该方法视为在numberOfTimes参数之前写入了哈希符号(#)


基本上,对于类内的方法,第一个参数默认仅为内部参数名。所有后续参数名默认为外部名称,其中外部名称默认为参数名。因此,
#
是多余的

func insertFileWithService(service: GTLServiceDrive, title: String)
相当于

func insertFileWithService(service: GTLServiceDrive, #title: String)

对于方法,而不是函数。这就是您收到警告的原因。

请这样命名您的方法:

@objc(insertFileWithService:title:)
func insertFile(service: GTLServiceDrive, title: String)
然后从Swift,这样称呼它:

obj.insertFile(serviceDrive, title: "Title")
在目标C中:

[obj insertFileWithService:serviceDrive title: @"Title"];

如果您这样做:
func insertFileWithService(service:GTLServiceDrive,#title:String)
你得到警告了吗?是函数还是方法?请看-它们的行为不同。是的,如果函数是类成员而不是全局成员,我可以复制这个警告。Ryan,你可能想扩展你的问题,以显示一个最小的完整示例。但我想说这是一个Xcode错误。@MattGibson,因为他可以删除
(按照比尔的建议),对吗?Jean-Philippe这是一种方法-我已经更新了我的问题,谢谢,不会的。“title:String”与“title:String”完全相同。我在书中找到了这个“如果要为函数参数提供外部参数名,并且本地参数名已经是合适的名称,则不需要为该参数写入两次相同的名称。相反,只需写入一次名称,并在名称前面加上哈希符号(#)”。这告诉Swift使用该名称作为本地参数名称和外部参数名称。”摘自:Apple Inc.“Swift编程语言”iBooks.这是否只适用于函数而不适用于方法?如果我理解正确,您的引用是针对函数而不是针对方法的。对于方法,本地参数名称被假定为除第一个参数外的所有参数的外部参数名称。请参阅我文章中引用的文本。对于方法,对于se来说#是隐式的cond参数,这就是您得到警告的原因,添加
#
是不必要的,编译器希望您确定您知道要完成什么。感谢您的完整解释。为什么在这里添加
@objc
注释?只需注释类(
@objc class…
)@Jean Philippell注释是为了给它一个更客观的C友好名称,而不会使Swift名称变得笨拙。这个示例将给出错误,“参数中的无关“#”。“characterToFind”在编写时已经是关键字参数名”。
obj.insertFile(serviceDrive, title: "Title")
[obj insertFileWithService:serviceDrive title: @"Title"];