标签: swift-extensions

如何在Swift协议中定义可选方法?

在Swift中有可能吗?如果没有,那么有解决方法吗?

ios swift swift-extensions swift-protocols

340
推荐指数
13
解决办法
15万
查看次数

覆盖Swift扩展中的方法

我倾向于只将必需品(存储属性,初始化器)放入我的类定义中,并将其他所有内容移动到自己的extension类中,有点像extension我将与之合并的每个逻辑块// MARK:.

例如,对于UIView子类,我最终会得到与布局相关的东西的扩展,一个用于订阅和处理事件等等.在这些扩展中,我不可避免地必须覆盖一些UIKit方法,例如layoutSubviews.我从未注意到这种方法有任何问题 - 直到今天.

以此类层次结构为例:

public class C: NSObject {
    public func method() { print("C") }
}

public class B: C {
}
extension B {
    override public func method() { print("B") }
}

public class A: B {
}
extension A {
    override public func method() { print("A") }
}

(A() as A).method()
(A() as B).method()
(A() as C).method()
Run Code Online (Sandbox Code Playgroud)

输出是A B C.这对我来说没什么意义.我读到有关静态分派的协议扩展,但这不是协议.这是一个常规类,我希望在运行时动态调度方法调用.显然,呼叫C至少应该动态调度和产生C

如果我删除继承NSObject …

swift swift-extensions swift2

119
推荐指数
4
解决办法
6万
查看次数

Objective-c代码可以在Class上调用swift扩展吗?

我搜索了一些帖子,我想我不能在swift下编写扩展名,并用Objective-C代码调用它,对吧?

@objc like属性只支持方法,类,协议?

objective-c swift swift-extensions

87
推荐指数
4
解决办法
4万
查看次数

如何为类别创建swift类?

我想创建现有swift类的类别,但IDE中没有选项可以这样做.

知道swift项目中是否存在类别?或者如何在swift项目中实现类似的功能?

swift swift-extensions

84
推荐指数
3
解决办法
6万
查看次数

使用Swift中的where子句扩展数组类型

我想使用Accelerate框架扩展[Float]和[Double],但每个都需要不同的实现.

我试过了明显的事:

extension Array<Float> {
}
Run Code Online (Sandbox Code Playgroud)

并得到此错误:

"必须在非特定的泛型类型'Array'上声明约束扩展,并使用'where'子句指定的约束"

以这种方式扩展Swift 2中的泛型类型是否可行?

我现在已经按预期运行了代码.这是一个使用Accelerate框架显示总和的示例.

extension _ArrayType where Generator.Element == Float {

    func quickSum() -> Float {
        var result: Float = 0
        if var x = self as? [Float] {
            vDSP_sve(&x, 1, &result, vDSP_Length(x.count))
        }
        return result
    }
}

extension _ArrayType where Generator.Element == Double {

    func quickSum() -> Double {
        var result: Double = 0
        if var x = self as? [Double] {
            vDSP_sveD(&x, 1, &result, vDSP_Length(x.count))
        }
        return result
    }
}
Run Code Online (Sandbox Code Playgroud)

generics swift swift-extensions swift2

70
推荐指数
4
解决办法
3万
查看次数

如何添加可选的字符串扩展名?

您可以像这样创建一个String扩展:

extension String {
   func someFunc -> Bool { ... }
}
Run Code Online (Sandbox Code Playgroud)

但是如果你想将它应用于可选字符串呢?

var optionalString :String? = ""
optionalString!.someFunc() /* String? does not have a member someFunc */
Run Code Online (Sandbox Code Playgroud)

swift swift-extensions

61
推荐指数
5
解决办法
2万
查看次数

创建一个扩展来从Swift中的Array过滤nils

我正在尝试编写一个Array的扩展,它允许将一个可选的T数组转换成一个非可选的T数组.

例如,这可以写成这样的自由函数:

func removeAllNils(array: [T?]) -> [T] {
    return array
        .filter({ $0 != nil })   // remove nils, still a [T?]
        .map({ $0! })            // convert each element from a T? to a T
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法将其作为扩展工作.我试图告诉编译器扩展只适用于可选值的数组.这是我到目前为止:

extension Array {
    func filterNils<U, T: Optional<U>>() -> [U] {
        return filter({ $0 != nil }).map({ $0! })
    }
}
Run Code Online (Sandbox Code Playgroud)

(它不编译!)

arrays generics swift swift-extensions

46
推荐指数
6
解决办法
2万
查看次数

如何在协议扩展中定义初始值设定项?

protocol Car {
     var wheels : Int { get set}

     init(wheels: Int)

}

extension Car {
    init(wheels: Int) {
        self.wheels = wheels
    }
}
Run Code Online (Sandbox Code Playgroud)

on self.wheels = wheels我得到了错误

Error: variable 'self' passed by reference before being initialized
Run Code Online (Sandbox Code Playgroud)

如何在协议扩展中定义初始化程序?

protocols initialization swift swift-extensions swift2

45
推荐指数
3
解决办法
2万
查看次数

Swift 2在协议扩展中使用变异函数时出错"无法在不可变值上使用变异成员:'self'是不可变的

不知道这里发生了什么,这似乎应该是非常直接的.我有一个可变var的协议,一个带有变异函数的扩展.在testClass.testFunc中出现问题,当我尝试使用扩展中声明的mtkAnimQueAppend时,我得到这个错误:"不能在不可变值上使用变异成员:'self'是不可变的.

protocol MTKAnimateValueDelegate {
    var mtkAnimQue:[MTKAnimateValue]? {get set}
}

extension MTKAnimateValueDelegate {
    ///Adds element to que
    mutating func mtkAnimQueAppend(element:MTKAnimateValue) {

        if mtkAnimQue != nil {
          mtkAnimQue?.append(element)
        } else {
          mtkAnimQue = [element]
        }
    }
}

class testClass: MTKAnimateValueDelegate {

  var mtkAnimQue:[MTKAnimateValue]?

  func testFunc() {
    var animValue = MTKAnimateValue(fromValue: 10, toValue: 20, inSeconds: 2)
    animValue.isAnimating = true
    mtkAnimQueAppend(animValue) //ERROR: "Cannot use mutating member on immutable value: 'self' is immutable
  }

}
Run Code Online (Sandbox Code Playgroud)

protocols swift-extensions swift-protocols ios9 swift2

45
推荐指数
1
解决办法
1万
查看次数

在Swift中返回instancetype

我正在尝试进行此扩展:

extension UIViewController
{
    class func initialize(storyboardName: String, storyboardId: String) -> Self
    {
        let storyboad = UIStoryboard(name: storyboardName, bundle: nil)
        let controller = storyboad.instantiateViewControllerWithIdentifier(storyboardId) as! Self

        return controller
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到编译错误:

错误:无法将'UIViewController'类型的返回表达式转换为返回类型'Self'

可能吗?我也想成为init(storyboardName: String, storyboardId: String)

swift swift-extensions swift2

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