Трудности назначить значение по умолчанию для параметра функции - PullRequest
0 голосов
/ 18 сентября 2018

В классе я определил личную константу, я пытаюсь использовать константу в качестве значения по умолчанию для параметра функции:

class Foo {
  // instance variable
  private let DefaultValue = 10

  // Compiler error: Cannot use instance member 'DefaultValue' as a default parameter
  public func doTask(amount: Int = DefaultValue) {
    ...
  }
}

Но я получаю ошибку компилятора: Cannot use instance member 'DefaultValue' as a default parameter.

Затем я также попытался объявить DefaultValue как private static:

class Foo {
      // static variable
      private static let DefaultValue = 10

      // Compiler error: Static let 'DefaultValue' is private and cannot be referenced from a default argument value
      public func doTask(amount: Int = DefaultValue) {
        ...
      }
    }

Но я получаю новую ошибку компилятора: Static let 'DefaultValue' is private and cannot be referenced from a default argument value

Мне нужно сохранить DefaultValue private этому классу, и я хотел бы присвоить значение по умолчанию параметру функции с закрытой переменной, достижимо ли это в Swift 4?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Несколько сложное, но работоспособное решение для сокрытия значения по умолчанию, которое вы хотите внутри своего класса, заключается в использовании протокола и соответствующей структуры, чьи подробные сведения известны только по объявлению файла Foo:

// enabling custom stuff
public protocol IntLike {
    var intValue: Int { get }
}

// allowing to pass Int's
extension Int: IntLike {
    public var intValue: Int { return self }
}

public class Foo {
    // the placeholder
    public struct FooIntLike: IntLike {
        // what we really want to hide
        fileprivate let realInt = 10

        public init() { }

        public var intValue: Int = Int.max // or 0, or whatever
    }

    public func doTask(amount: IntLike = FooIntLike()) {
        // default value will expand to a non-nil value for `realInt`
        let amount = (amount as? FooIntLike)?.realInt ?? amount.intValue
        // do your stuff with the amount
    }
}

Абоненты doTask могут передавать Int, не зная, что предоставляет значение по умолчанию.

0 голосов
/ 19 сентября 2018

Как насчет переменной верхнего уровня?

fileprivate let DefaultValue = 10

class Foo {
    public func doTask(amount: Int = DefaultValue) {
        ...
    }
}
0 голосов
/ 18 сентября 2018

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

Возможный обходной путь - сделать параметр необязательным и заменитьnil локально по умолчанию:

class Foo {
    private static let DefaultValue = 10

    public func doTask(amount: Int? = nil) {
        let amount = amount ?? Foo.DefaultValue
        // ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...