标签: swift-extensions

为什么Swift不允许在扩展中存储属性?

我一直在努力寻找在扩展中实现存储属性的最佳方法,并遇到了这个问题:Swift扩展存储属性的替代方案.但是,我没有在讨论中或其他任何地方找到原因.有没有理由在Swift中不允许存储属性?如果是这样,原因是什么?

swift swift-extensions swift2

3
推荐指数
1
解决办法
452
查看次数

Swift结构扩展函数 - "不能在'self'中赋予'origin'"

Swift中的结构可以包含函数并且可以包含扩展.凉!看起来像一个简洁的方法,使这个功能可用于更多的类,并减少参数传递.这是函数最初在地图视图控制器中查看的方式:

    func expandTrackRectToCoordinate(coordinate : CLLocationCoordinate2D) {

    let point = MKMapPointForCoordinate(coordinate)
    let newRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)

    if MKMapRectIsNull(trackRect) {
        trackRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)
    } else {
        trackRect = MKMapRectUnion(trackRect, newRect)
    }
}
Run Code Online (Sandbox Code Playgroud)

trackRect 是该类的MKMapRect成员.

MKMapRect扩展为包括每个点,以便可以根据需要将地图重置为整个区域,显示所有点.

我试图将它作为MKMapRect的扩展(部分 - 显示直到错误):

extension MKMapRect {

func expandToIncludeCoordinate(coordinate : CLLocationCoordinate2D) {

    let point = MKMapPointForCoordinate(coordinate)
    let newRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)

    if MKMapRectIsNull(self) {
        self.origin = point       <-------- Cannot assign to 'origin' in 'self'
        self.size = CGSizeZero
    } else {
Run Code Online (Sandbox Code Playgroud)

我没想到能够分配给自己,但我确实希望能够分配给结构的成员.如何才能做到这一点?

swift swift-extensions

2
推荐指数
1
解决办法
577
查看次数

使用IBInspectable在选定状态下的UIButton边框颜色

我正在使用像这样的Swift扩展@IBInspectable来设置边框颜色UIButton:

extension UIButton {
  @IBInspectable var borderWidth: CGFloat {
    get {
      return layer.borderWidth
    }
    set {
      layer.borderWidth = newValue
      layer.masksToBounds = newValue > 0
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

...但我也想拥有按钮状态的selectedBorderColor属性.Selected.这可能是这样的扩展吗?我是否必须以UIButton某种方式继承并检查按钮状态?

extension UIButton {
  @IBInspectable var borderWidth: CGFloat {
    get {
      return layer.borderWidth
    }
    set {
      layer.borderWidth = newValue
      layer.masksToBounds = newValue > 0
    }
  }
  //This is what I want to do...
  @IBInspectable var selectedBorderWidth: CGFloat {
    get {
      return layer.borderWidth
    } …
Run Code Online (Sandbox Code Playgroud)

uibutton ios swift swift-extensions ibinspectable

2
推荐指数
1
解决办法
3225
查看次数

扩展Swift数组以按类型过滤元素

如何扩展swift数组以访问特定类型的成员?

如果数组包含从同一个超类继承的多个类的实例,则这是相关的.理想情况下,它会适当地强制执行类型检查.


一些不太有用的想法和事情:

使用该filter(_:)方法工作正常,但确实强制类型安全.例如:

protocol MyProtocol { }
struct TypeA: MyProtocol { }
struct TypeB: MyProtocol { }

let myStructs:[MyProtocol] = [ TypeA(), TypeA(), TypeB() ]

let filteredArray = myStructs.filter({ $0 is TypeA })
Run Code Online (Sandbox Code Playgroud)

filteredArray包含了正确的价值观,但类型仍然[MyProtocol]没有[TypeA].我希望更换最后一个let filteredArray = myStructs.filter({ $0 is TypeA }) as! [TypeA]可以解决这个问题,但项目失败了EXEC_BAD_INSTRUCTION,我不理解.也许类型转换阵列是不可能的?

理想情况下,此行为可以包含在数组扩展中.以下内容无法编译:

extension Array {
    func objectsOfType<T:Element>(type:T.Type) -> [T] {
        return filter { $0 is T } as! [T]
    }
}
Run Code Online (Sandbox Code Playgroud)

这里似乎至少有两个问题:类型约束T:Element似乎不起作用.我不确定基于泛型类型添加约束的正确方法是什么.我的意图是说T …

arrays generics swift swift-extensions

2
推荐指数
1
解决办法
1284
查看次数

如何为所有具有".contains"的类型创建扩展?

我想创建一个具有.containsAPI的所有类型的扩展.

例如,我为字符串做了这个,但是想为所有类型扩展它:

func within(values: [String]) -> Bool {
    return values.contains(self)
}
Run Code Online (Sandbox Code Playgroud)

有了这个,而不是这个:

["abc", "def", "ghi"].contains("def")

为方便起见,我可以这样做:

"def".within(["abc", "def", "ghi"])

但是我想和这样的事情一起工作,例如:

[.North, .South].contains(.West)

所以我可以用枚举来做到这一点:

let value = .West
value.within([.North, .South])
Run Code Online (Sandbox Code Playgroud)

是否可以为此方案创建广泛的扩展?

swift swift-extensions swift2 swift2.2

2
推荐指数
1
解决办法
75
查看次数

通过扩展实现协议

我正在尝试创建一个协议,包含使用UIImagePickerController的过程,使其在我的应用程序中更流线型.我基本上有这样的事情:

public protocol MediaAccessor : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func mediaCaptured(title: String, fileData: NSData, fileType: String)
}
Run Code Online (Sandbox Code Playgroud)

和一个扩展,它完成了请求权限和处理委托方法的所有繁重工作:

public extension MediaAccessor where Self : UIViewController {
    public func captureMedia() {
        //All sorts of checks for picker authorization
        let picker = UIImagePickerController()
        picker.delegate = self
        self.presentViewController(picker, animated: true, completion: nil)
    }

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
        //implementation of the delegate in extension
        //even though everything compiles, this method is not called on picker completion
    }
} …
Run Code Online (Sandbox Code Playgroud)

swift swift-extensions swift-protocols

2
推荐指数
1
解决办法
439
查看次数

扩展另一个结构内部的结构

我正在尝试扩展struct已经存在的内容struct.当我写下面的代码时,我明白了

声明仅在文件范围内有效.

struct A {
    struct AA {

    }
}

extension A {
    extension AA {

    }
}
Run Code Online (Sandbox Code Playgroud)

在扩展中编写扩展名是否无效?

extension-methods swift swift-extensions swift3

2
推荐指数
1
解决办法
685
查看次数

== 和 : 在 swift 扩展 where 条件中有什么区别

我在 swift 扩展中有一个问题:

protocol Racer {
    var speed: Double { get }
}
extension Sequence where Iterator.Element == Racer {
    func fastest() -> Iterator.Element? {
        return self.max(by: { (a: Iterator.Element, b: Iterator.Element) -> Bool in
            return a.speed < b.speed
        })
    }
}

extension Sequence where Iterator.Element: Racer {
    func bla() -> Void {

    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道它们之间有什么区别。实际上,类型的数组[Racer]没有bla()功能。


编辑1?还有一个问题,假设我们有一个结构体符合Racer

struct Human: Racer {
    var speed: Double
}
Run Code Online (Sandbox Code Playgroud)

如果我们有一个Array<Racer>

let me = Human(speed: 99999)
let you …
Run Code Online (Sandbox Code Playgroud)

swift swift-extensions

2
推荐指数
1
解决办法
1755
查看次数

如何使用私有集扩展协议?

我正在编写一个具有readOnly标签的协议.我想扩展它并给它一个默认的实现,其中符合类型是a UITextView.

码:

protocol CountingView {

    var keyboardLabel : UILabel {get}   
}

extension CountingView where Self : UITextView {

    var keyboardLabel : UILabel {
        get {
            let label = UILabel()
            label.textColor = UIColor.white
            label.translatesAutoresizingMaskIntoConstraints = false

            return label
        }
        private (set) {
            keyboardLabel = newValue
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我添加private之前,set我得到以下错误.

期望'get','set','willSet'或'didSet'关键字来启动访问者定义

我查看了这个错误的其他问题,但没有发现它们与我的相关.

protocols private swift swift-extensions swift-protocols

2
推荐指数
1
解决办法
1654
查看次数

使用自定义颜色扩展UIColor是真的吗?

我的应用程序有一些自定义颜色,现在它像字典一样保存,但我认为这不是一个好主意,我想用自定义颜色对UIColor进行扩展.

这可能看起来像这样

var newColor = UIColor.MyColor // like UIColor.white
Run Code Online (Sandbox Code Playgroud)

也许我应该用扩展名添加我的颜色枚举?

uicolor ios swift swift-extensions

2
推荐指数
2
解决办法
1538
查看次数