2016-07-12 2 views
2

У меня есть проект Swift 2 в XCode 7.3, где я использую две разные сторонние структуры.Объявление о нарушении подпроцесса, связанное с расширением, в Swift

'FrameworkA' объявляет публичное UIView расширения объявляющего cornerRadius свойства как это:

extension UIView { 
    var cornerRadius: CGFloat { 
     get { return self.layer.cornerRadius } 
     set(cornerRadius) { 
      self.layer.masksToBounds = true 
      self.layer.cornerRadius = cornerRadius 
     } 
    } 
} 

'FrameworkB' Объявляет UIView подкласса с cornerRadius собственности:

class TagView: UIView { 
    var cornerRadius: CGFloat = 0 { 
     didSet { 
      layer.cornerRadius = cornerRadius 
      layer.masksToBounds = cornerRadius > 0 
     } 
    } 
} 

Обе структуры компилировать прекрасно, как они не знают друг друга. Однако, при попытке использовать свойство «FrameworkB» в моем коде:

let view = UIView() 
view.cornerRadius = 10 // FrameworkA: Ok 

let tagView = TagView(title: "") 
tagView.cornerRadius = 10 // Compilation error 
(tagView as UIView).cornerRadius = 10 // FrameworkA: Ok 

Это терпит неудачу с ошибкой:

Ambiguous use of 'cornerRadius'

Я могу назвать «» FrameworkA расширения свойств типа литье до UIView, но я не могу назвать свойство класса FrameworkB, даже если я не импортирую 'FrameworkA' в этот файл. Как только я импортирую «FrameworkA» где-то в проект, он начинает сбой.

Есть ли способ явно указать компилятору использовать метод «FrameworkB» или не импортировать «FrameworkA» в файл Swift?

Edit: Чтобы воспроизвести его можно использовать Wakup и TagListView стручки (FrameworkA и FrameworkB соответственно) и попытаться выполнить код, приведенный выше.

+0

Что произойдет, если вы используете '(tagView в TagView) .cornerRadius = 10' или' (tagView в TagListView.TagView) .cornerRadius = 10' –

+0

@LukeVanIn же ошибка. Я не думаю, что это имеет значение, потому что 'tagView' уже является« TagView ». – redent84

ответ

1

Мое настоящее решение заключается в создании динамической рамки-цели «ProxyFramework» в том же проекте. Я добавляю иждивенцев «FrameworkB» с помощью Cocoapods и объявить новое свойство, которая не вступает в противоречие с методом расширения, объявленного в «FrameworkA»:

public extension TagList { 
    public dynamic var cornerRadius_: CGFloat { 
     get { return cornerRadius } 
     set { cornerRadius = newValue } 
    } 
} 

В моей цели приложения, добавить вновь созданную каркасную цель " Целевые зависимости, так что я теперь в состоянии использовать „свойство FrameworkB“ через этот прокси-структуру:

let view = UIView() 
view.cornerRadius = 10 // FrameworkA: Ok 

let tagView = TagView(title: "") 
tagView.cornerRadius_ = 10 // ProxyFramework -> FrameworkB: Ok 
(tagView as UIView).cornerRadius = 10 // FrameworkA: Ok 

Я хотел бы видеть более чистое решение.

0

Если вы используете эти разные классы в несвязанных местах, возможно, вы можете импортировать определенные символы только в исходные файлы, которые им действительно нужны.

import class FrameworkA.TagView 
Смежные вопросы