Как получить ожидаемое значение #function или #line? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть функция, которая содержит #function и #line, которая возвращает строку:

func exportMessage(content: String) -> String {
    if let fileURL = URL(string: #file) {
        return "\(fileURL.lastPathComponent): \(#function) - Line: \(#line)\n\(content)"
    }

    return "\(#function) - Line: \(#line)\n\(content)"
}

При попытке использовать exportMessage над функцией в другой функции:

func doSomething() {
    let result = exportMessage(content: "instance is nil")
    print(result)
}

Вывод:

MyPlayground.playground: exportMessage (content :) - Строка: 5

Экземпляр равен nil

Содержит «exportMessage»"но не " doSomething "в качестве имени функции (#function).Это то же самое для номера строки, это номер строки в exportMessage(), но , а не в doSomething().

Я ожидаю получить имя функции и номер строки для doSomething(), as:

MyPlayground.playground: doSomething () - Строка: 12

экземпляр равен nil

Так как я собираюсь использовать exportMessage во многих функциях я бы предположил, что это должно относиться к функции вызывающей стороны.Это достижимо?Как?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Используйте #function и #line в качестве значений по умолчанию в методе.Значения по умолчанию оцениваются в точке вызова.

func exportMessage(content: String, file: String = #file, function: String = #function, line: Int = #line) -> String {
    if let fileURL = URL(string: file) {
        return "\(fileURL.lastPathComponent): \(function) - Line: \(line)\n\(content)"
    }

    return "\(function) - Line: \(line)\n\(content)"
}
0 голосов
/ 21 ноября 2018

То, что вы предлагаете, на самом деле не имеет смысла, потому что неясно, «какой абонент должен печатать»?Почему doSomething?Почему не абонент doSomething?Или абонент звонящего?В конечном итоге, если так поступили #function и друзья, он напечатал бы start из libdyld.dylid.

. Чтобы добиться желаемого поведения, вы должны вручную ввести #function и#line значения из родительского контекста:

func exportMessage(
    content: String,
    callingFunction: String = #function,
    callingLine: Int = #line
) -> String {
    if let fileURL = URL(string: callingFunction) {
        return "\(fileURL.lastPathComponent): \(callingFunction) - Line: \(callingLine)\n\(content)"
    }

    return "\(callingFunction) - Line: \(callingLine)\n\(content)"
}

func doSomething() {
    let result = exportMessage(content: "instance is nil")
    print(result)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...