2014-10-15 2 views
5

методы расширения массива недоступны из других модулей (например, проект XCTest)расширение массива вызывается из других модулей

Для простоты ниже код ничего не делает, но он может быть использован для воспроизведения ошибки

import Foundation 

extension Array { 
    mutating func myMethod(toIndex: Int) -> Int! { 
     // no real code, it's here only to show the problem 
     return 0 
    } 
} 

Вызов его из одних и тех же модуль работает, как ожидалось, но из тестового класса не

class MyProjectTests: XCTestCase { 
    func testMoveObjectsFromIndexes1() { 
     var arr = ["000", "001", "002", "003"] 
     arr.myMethod(0) 
    } 
} 

Я думаю, что это правильно, потому что видимость метод restricte d его собственный модуль, на самом деле я получаю ошибку '[String]' does not have a member named 'myMethod'

Я попытался определить расширенный метод как public, как показано ниже

extension Array { 
    public mutating func myMethod(toIndex: Int) -> Int! { 
     // no real code, it's here only to show the problem 
     return 0 
    } 
} 

Но я получаю ошибку 'Extension of generic type 'Array<T>' from a different module cannot provide public declarations'

компилировать До Beta 7 с использованием public решил проблему, но под XCode 6.1 (6A1046a) Я получаю эту ошибку

Как исправить ее для работы под другими модулями/проектами?

+0

Почему продлить Массив, когда вы можете объявить публичную функцию верхнего уровня? – mattt

+3

Вы не можете исправить эту проблему. Swift 1.1 отключил публичные расширения родовых типов вне вашего собственного модуля явно, потому что реализация не была лучшей, когда они это позволяли. Радар для его возвращения. – CodaFi

+0

@mattt это просто пример, чтобы воспроизвести проблему, настоящий код использует элементы массива, поэтому он идеален как расширение. – dafi

ответ

3

В настоящее время Swift не разрешает публичные расширения, поэтому вам нужно будет включить этот быстрый файл расширения в свой проект и поместить его в цель.

1

Пока не полностью решить оригинальный вопрос, я считаю, что я мог бы методы расширения тест в Swift 2.0 (под XCode 7.0), импортируя модуль с @testable директивы:

@testable import MyGreatModule

+1

Полностью пропустил эту новую функцию в Swift 2 ... спасибо! Это решило множество проблем с тестированием со стороны Swift-ers :) – mdstroebel

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