Как вызвать функцию C из Swift, имя которой совпадает со структурой? - PullRequest
2 голосов
/ 07 марта 2019

В C существуют отдельные пространства имен для функций и структур.Модуль Darwin экспортирует как struct flock, так и func flock.Если я пытаюсь вызвать функцию, компилятор разрешает имя в инициализаторе структуры:

let result: Int32 = Darwin.flock(fd, LOCK_EX)
                           ^^^^^
                           Cannot invoke initializer
                           for type 'flock' with an argument list
                           of type '(Int32, Int32)'

Если я пытаюсь разрешить имя вручную через именованный импорт, я все равно получаю ошибку:

import func Darwin.flock
            ^^^^^^^^^^^^
            Ambiguous name 'flock' in module 'Darwin'

Также не повезло со ссылкой на функцию:

let functionNotStruct: (Int32, Int32) -> Int32 = Darwin.flock
                       ^^^^^^^^^^^^^^^^^^^^^^^
                       Cannot convert value of type 'flock.Type'
                       to specified type '(Int32, Int32) -> Int32'

Есть ли способ сказать компилятору, что я хочу функцию, а не инициализатор?

1 Ответ

2 голосов
/ 07 марта 2019

Я не могу объяснить, почему это имеет значение, но без имя модуля делает его компилируемым:

// Call `flock()`:
let result = flock(fd, LOCK_EX)

// Use `struct flock`:
var fl = flock()
fl.l_start = 0
...