2016-04-29 2 views
7

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

Я бы хотел избежать загрязнения категории, хотя, если эти расширения не запрашиваются.

Можно ли записать их так, что они применяются только тогда, когда я сделал определенный импорт, как:

import MySwiftExtensions 

// Use custom extensions 
let x = [1,3,5,7].average() 
let y = [1,3,5,7].firstWhere { $0 > 3 } 
let z = "campervan".make1337() 

Я мог бы написать их как статические методы, обернутые в одном классе буквы (например: ø.average([1,3,5,7]) , например lodash), чтобы достичь того же, но иногда вы получаете гораздо более сжатое использование из методов экземпляра.

+6

Вы пробовали поместить расширения в отдельную структуру и импортировать по мере необходимости? –

ответ

2

Вы писали:

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

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

Как только каркас либо встроенный, либо в том же рабочем месте, то вы должны быть в состоянии импортировать его в любой отдельный файл в проекте с:

import MySwiftExtensions 

Любой файл, который не имеет оператор импорта будет не имеют доступа к расширениям.

EDIT:

Вот a link в блоге, который описывает, как создать Cocoa Touch Framework. И вот another link, в котором подробно описывается, как использовать рабочие пространства для использования фреймворков в проектах разработки.

+0

Это похоже на то, что я хочу. Как управлять этим в xcode для меня новичок. У вас есть ссылка, которая объясняет идею создания фреймворка, включая его в рабочей области, и встраивает его в конечный продукт (возможно [это] (https://www.raywenderlich.com/65964/create-a-framework -for-ios)?) – SimplGy

+0

См. мой отредактированный ответ, который содержит некоторые ссылки. –

+0

Мне жаль, просто оговорка. Я не понимаю нужды. В моем проекте, как правило, у меня есть один файл со всеми расширениями, в чем преимущество импорта фреймворка в другой prj, основанный на 1 файле для моего случая? Не удалось скопировать его быстрее? –

1

Я хотел бы обратить внимание на то, что вы сообщили: «..only применяется, если я сделал определенный импорт ..» Это также означает, что вы хотите, чтобы эти расширения могут быть применены только к определенному классу

Как сообщалось в этом интересном Apple, блог chapter и в официальной компании Apple doc вы можете справиться с «Контроль доступа» вашего расширения

вы можете расширить класс, структуру или перечисление в любом доступа контекста, в котором класс, структура или перечисление. Любые члены типа, добавленные в расширение, имеют одинаковый доступ по умолчанию уровень как члены типа, объявленные в первоначальном типе, который расширяется. Если вы распространяете общедоступный или внутренний тип, любые добавляемые вами новые члены типа будут иметь внутренний уровень доступа по умолчанию. Если вы добавите частный тип , любые добавляемые вами новые члены типа будут иметь уровень доступа по умолчанию частный.

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

/* no access level modifier: default access level will be 'internal' */ 
    extension UIViewSubClass 
    { 
     // default access level used: internal 
     var helloWorld : String { 
      get { 
       return "helloWorld" 
      } 
     } 
    } 

    // modify default access level to public 
    public extension UIViewSubClass 
    { 
     // default access level used: public 
     var helloWorld : String { 
      get { 
       return "helloWorld" 
      } 
     } 
    } 

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

// modify default access level to private 
private extension UIViewSubClass 
{ 

    var helloWorld : String { 
     get { 
      return "helloWorld" 
     } 
    } 
} 
0

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

protocol ExampleProtocol { 

} 

extension ExampleProtocol where Self: UIViewController{ 

    // extend what you need to here 
} 
Смежные вопросы