小编tom*_*dey的帖子

不支持使用协议作为符合'AnyObject'的具体类型

我正在尝试实现一个简单的多委托情况:

protocol Subscribable: class {
    associatedtype Subscriber: AnyObject
    var subscribers: NSHashTable<Subscriber> { get }
}

protocol ControllerSubscriber: class {
    func controllerDidSomething()
}

class Controller: Subscribable {
    typealias Subscriber = ControllerSubscriber
    var subscribers = NSHashTable<Subscriber>.weakObjects()  // Error
}
Run Code Online (Sandbox Code Playgroud)

错误:不支持使用'ControllerSubscriber'作为符合协议'AnyObject'的具体类型.

我的问题是:

  • 这个错误究竟意味着什么?
  • 我试图做的事情的基本概念是什么?
  • 为什么这"不受支持"?

当然,我该如何解决这个问题?从实际的解决方案而不是解决方案.

我很难理解Swift的泛型系统.我似乎经常遇到这样看似简单的情况.我只是想把一个符合协议的东西放到另一个东西:(.我想知道我的想法出错了所以我可以解决它,而不必再看到这些错误.

这个相关的问题,但请注意答案只给出解决方法,没有解释或解决方案.

generics macos ios swift

10
推荐指数
1
解决办法
1938
查看次数

我可以在后台线程中获取PHAssets吗?

我想在用户的照片库上做一些工作.由于库可能很大,我想在后台进行.我想知道是否可以安全地执行资产提取(例如PHAsset.fetchAssets)并在后台处理它们?

我现在只需要资产元数据.

这样的事情是安全的:

class ViewController: UIViewController {

    var cachedResult = [Any]()

    func doBackgroundCalculationsOnPhotos(completionHandler: ([Any]) -> ()) {
        DispatchQueue.global(qos: .userInitiated).async {
            let photos = PHAsset.fetchAssets(with: .image, options: nil)
            var result = [Any]()

            photos.enumerateObjects({ asset, _, _ in  
                result.append(calculateSomething(asset))
            })

            DispatchQueue.main.async {
                self.cachedResult = result
                completionHandler(result)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有任何文档参考我可以了解照片框架和后台访问?

multithreading ios swift photosframework

9
推荐指数
1
解决办法
359
查看次数

`NSExtensionContext.completeRequest` 中 `returningItems` 的目的是什么?

我正在我的 iOS 应用程序中开发一个标准的 Action Extension,Xcode 模板包含以下几行:

@IBAction func done() {
    // Return any edited content to the host app.
    // This template doesn't do anything, so we just echo the passed in items.
    self.extensionContext!.completeRequest(returningItems: self.extensionContext!.inputItems, completionHandler: nil)
}
Run Code Online (Sandbox Code Playgroud)

下面是对文件completeRequest

问题

  • 传递returningItems给的目的是completeRequest什么?
  • 应用程序是否真的从操作扩展接收编辑过的内容?
  • 如果是,我在哪里可以找到接收端的 API?
  • 我传递空数组的后果是什么?

ios swift

7
推荐指数
1
解决办法
598
查看次数

接受类型序列的函数

我想要一个接受序列的函数Int.这是我想写的:

func process(items: Sequence<Int>) {
   items.forEach { ... }
}
Run Code Online (Sandbox Code Playgroud)

错误:"无法专门化非泛型类型'序列'".

更正(我认为):

func process<S: Sequence>(items: S) where S.Iterator.Element == Int {
    items.forEach { ... }
}
Run Code Online (Sandbox Code Playgroud)

相当多一些冗长.

我知道序列协议具有相关联的类型的Iterator,其具有Element.但我不太清楚为什么我必须以Int这种奇怪的方式解决这个问题.

使第一个版本不起作用但第二个版本不起作用的基本概念是什么?错误是什么意思?

generics macos ios swift

6
推荐指数
1
解决办法
229
查看次数

如何遵守MutableCollection?

我很难找到有关如何遵守MutableCollection. 谷歌在这个话题上完全是空的。

\n\n

例如,我想为GMSPath/添加一致性GMSMutablePath

\n\n
import CoreLocation\nimport GoogleMaps\n\nextension GMSPath: RandomAccessCollection {\n\n    public var startIndex: Int {\n        return 0\n    }\n\n    public var endIndex: Int {\n        return count\n    }\n\n    public func index(before i: Int) -> Int {\n        return i-1\n    }\n\n    public func index(after i: Int) -> Int {\n        return i+1\n    }\n\n    public subscript(position: Int) -> CLLocationCoordinate2D {\n        return coordinate(at: UInt(position))\n    }\n}\n\nextension GMSMutablePath: MutableCollection {  // Error!\n\n    public override subscript(position: Int) -> CLLocationCoordinate2D {\n        get {\n …
Run Code Online (Sandbox Code Playgroud)

macos cocoa cocoa-touch ios swift

5
推荐指数
1
解决办法
2379
查看次数

如何用 UIBezierPath 绘制圆角矩形?

我正在尝试用圆角矩形掩盖视图UIBezierPath。我希望蒙版看起来与我刚刚设置时完全相同layer.cornerRadius

let frame = CGRect(x: 0, y: 0, width: 80, height: 80)
let cornerRadius = 30
Run Code Online (Sandbox Code Playgroud)

使用cornerRadius

let view = UIView(frame: frame)
view.layer.cornerRadius = cornerRadius
Run Code Online (Sandbox Code Playgroud)

使用UIBezierPath面膜

let view = UIView(frame: frame)
let maskingShape = CAShapeLayer()
maskingShape.path = UIBezierPath(roundedRect: frame, cornerRadius: cornerRadius).cgPath
view.layer.mask = maskingShape
Run Code Online (Sandbox Code Playgroud)

生成的圆角矩形完全不同。标准cornerRadius按预期工作,而贝塞尔曲线路径仅捕捉到特定半径的完整圆。

在此输入图像描述

显然,这是 iOS 7 的预期行为。

那么如何绘制带有贝塞尔曲线路径的标准圆角矩形呢?

我找到了这个类别,但这一定是个笑话吧?难道就没有更简单的办法吗?:(

相关问题

ios uibezierpath swift

5
推荐指数
0
解决办法
1264
查看次数