添加/设置方法的Swift命名约定

时间:2017-02-22 00:21:30

标签: swift naming-conventions

在Objective-C中,您可能有一个像这些

之类的方法
-(void)addWidget(Widget*)widget classification:(WidgetClassification*)classification;

-(void)setText:(NSString*)text color(UIColor*)color style:(FontStyle)style 

在Swift 3+中,你可以选择将名称翻译成这两个(让我们称之为Objective-C风格):

func addWidget(_ widget: Widget, classification: WidgetClassification)

func setText(_ text: String, color: UIColor, style: FontStyle)

或者这个(我们称之为swift 3风格)

func add(widget: Widget, classification: WidgetClassification)

func set(text: String, color: UIColor, style: FontStyle)

我个人认为后者set(text...看起来感觉更好,但是当回到Objective-C时,编译器会把它翻译为setWithText:(NSString*)text...,感觉有点奇怪。

是否有既定的惯例? setText(_ text: String...变体更适合Objective-C,但不喜欢它与所有参数名称暴露的Swift 3样式对齐

我很感激对此有任何意见以及人们对此的看法

2 个答案:

答案 0 :(得分:1)

  
      
  • 忽略不必要的单词。名称中的每个单词都应该突出显示   使用现场的信息。

         

    可能需要更多的词语来澄清意图或消除歧义意义,   但那些与读者已有信息多余的东西   应该省略所有权。特别是,省略仅仅的单词   重复类型信息。

    public mutating func removeElement(_ member: Element) -> Element?
    
    allViews.removeElement(cancelButton) In this case, the word `Element`
    
         

    在呼叫网站上没有任何显着内容。这个API会更好:

    public mutating func remove(_ member: Element) -> Element?
    
    allViews.remove(cancelButton) // clearer Occasionally, repeating type
    
         

    信息是避免歧义的必要条件,但一般来说都是如此   最好使用一个描述参数角色的词而不是它的角色   类型。有关详细信息,请参阅下一项。

  •   

来自https://swift.org/documentation/api-design-guidelines/

答案 1 :(得分:1)

感谢swift api设计指南的链接。

虽然他们没有明确地说出来,但是有足够的线索可以让我认为swift 3的创建者肯定打算在这些情况下仍然使用Objective-C命名样式。 / p>

首先,"补偿弱类型信息"部分将此显示为" Good"例如:

func addObserver(_ observer: NSObject, forKeyPath path: String)
grid.addObserver(self, forKeyPath: graphics) // clear

由于KVO是一个客观的C事物,但它没有让我信服它,但是在公约/参数部分中,他们将其视为另一个" Good"例如:

/// Replace the given `subRange` of elements with `newElements`.
mutating func replaceRange(_ subRange: Range, with newElements: [E])

例如,挖掘Array类定义,找到

public func dropLast(_ n: Int) -> ArraySlice<Element>

public func withUnsafeBytes<R>(_ body: (UnsafeRawBufferPointer) throws -> R) rethrows -> R

和各种类似的方法,都使用&#34; Objective-C&#34;命名风格。

对我而言,似乎swift的作者打算采用我的set(x:命名方式,他们会调用这些方法

replace(subrange: Range, with newElements: [E])

drop(last n: Int)

with(unsafeBytes body: ...

但他们没有。

看起来他们走的是#34;通常不会压制第一个参数的外部名称,除非语法让你觉得这样做更好“&#34 34。

我想这可能对整体可读性来说更好,即使它需要更多的努力来思考。

谢谢!