2014-11-14 2 views
1

Я пытаюсь написать некоторые вспомогательные функции и получаю ошибку «Недопустимое исправление» некоторых подобных методов. Если кто-нибудь сможет объяснить, почему эти методы сталкиваются, я был бы очень благодарен.Недопустимое переопределение функции в Swift

func CGRectModify(rect: CGRect, x: CGFloat) -> CGRect { 
    return CGRectMake(x, rect.origin.y, rect.size.width, rect.size.height) 
} 

func CGRectModify(rect: CGRect, y: CGFloat) -> CGRect { 
    return CGRectMake(rect.origin.x, y, rect.size.width, rect.size.height) 
} 

func CGRectModify(rect: CGRect, width: CGFloat) -> CGRect { 
    return CGRectMake(rect.origin.x, rect.origin.y, width, rect.size.height) 
} 

func CGRectModify(rect: CGRect, height: CGFloat) -> CGRect { 
    return CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, height) 
} 

Я бы подумал, что, поскольку второй параметр имеет другое внешнее имя, метод будет понимать, что он имеет другую подпись. Кажется, это не так.

Я использую документ Apple для справки, но в разделе Local and External Parameter Names for Methods я не смог найти свой ответ. Любой вход очень ценится.

ответ

6

Правило «автоматических внешних имен параметров» для функций отличается от методов.

Swift применяет различные правила, зависит от типа вызываемых вызовов.

  1. Функции/Затворыdocument

    Нет "автоматические внешние имена параметров" не выполняются.

    func f(x:Int, y:Int) { /* ... */ } 
    let c = { (x:Int, y:Int) -> Void in /* ... */ } 
    
    f(1, 2) 
    c(1, 2) 
    
  2. Инициализаторыdocument

    "автоматические внешние имена параметров" являются по умолчанию для каждого параметра.

    class Foo { 
        init(x:Int, y:Int) { /* ... */ } 
    } 
    
    let foo = Foo(x: 1, y: 2) 
    
  3. Методыdocument

    "автоматические внешние имена параметров" за исключением для первого параметра.

    extension Foo { 
        func bar(x:Int, y:Int) { /* ... */ } 
    } 
    
    foo.bar(1, y:2) 
    
  4. Подстрочный → документ отсутствует?

    Отсутствуют «имена автоматических внешних параметров».

    extension Foo { 
        subscript(x:Int, y:Int) -> Void { 
         get { /* ... */ } 
        } 
    } 
    
    foo[1, 2] 
    

И особое правило ...

  • Значения по умолчанию

    func fz(x:Int, y:Int, z:Int = 1) { /* ... */ } 
    
    fz(1, 1, z: 1) 
    

Конечно, вы можете изменить это поведение по умолчанию с помощью:

  • _ name:Type: отключить "автоматические внешние имена параметров"
  • #name:Type: силы «автоматические внешние имена параметров»
  • externalName internalName:Type: явное внешнее имя
0

Это действительно похоже на ошибку в документации. В разделе, в котором я первоначально был связан, Local and External Parameter Names for Methods написано следующее объяснение.

Это поведение по умолчанию эффективно лечит метод, как если бы вы написали символ хэш (#) перед параметром numberOfTimes:

func incrementBy(amount: Int, #numberOfTimes: Int) { 
     count += amount * numberOfTimes 
} 

Это не тот случай. Когда я добавляю хэш-символ (#) ко второму параметру, ошибка компилятора не возникает.

func CGRectModify(rect: CGRect, #height: CGFloat) -> CGRect { 
    return CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, height) 
} 
+2

документа вы упомянули для методов, а не для функций. Для функций см. Это: https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-XID_255 – rintaro

+0

Эй, очень круто. Это имеет смысл сейчас. Огромное спасибо. (Вы должны сделать ответ) – atreat

Смежные вопросы