标签: swift-extensions

Xcode只看到一些嵌套类的类似扩展,这些扩展是用不同的文件编写的

我试图保持我的代码尽可能可读,方法是保持方法和文件尽可能短,并使用嵌套类进行命名空间.除了一些非常奇怪的时刻,它工作正常.

我有一些用于命名空间的类.

class Space { }
Run Code Online (Sandbox Code Playgroud)

在该文件中使用的所有类都在它们自己的文件中作为扩展实现.

extension Space {
    class SomeClass {
       // implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

其中一个SomeClasses有很多相当复杂的初始化程序,所以我将它们分成了自己的文件并按如下方式实现:

extension Space.SomeClass {
    convenience init(fromSomeSource source: SourceClass) {
        self.init()
        // other implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是这些文件中的一些工作正常,但其中一些投掷'SomeClass' is not a member type of 'Space',我不知道为什么.

所有这些都很相似.唯一的区别是初始化器本身的实现.所有文件都保存在同一个地方,我不知道为什么有些文件可以正常工作,有些则没有.

我试图将代码从不工作的文件移动到工作正常的文件,并且工作正常--Xcode同意看到代码并且没有反对它.但是当相同的代码存在于自己的文件中时 - Xcode或编译器不想理解它SomeClass实际上是其成员Space.

我试图清理构建,包括手动转储~/Library/Developer/Xcode/DerivedData文件夹.什么都没有帮助.

当然,我可以将它全部放在一个文件中,它可以正常工作,但是在我的情况下它如此挑剔的原因是什么?


我试图创建一个新文件,然后从其中一个坏文件中移出所有内容.它可以工作,但只能使用某些文件名.有些名称再次出现相同的错误,但似乎如果名称是全新的并且与现有名称不相似 - 它可以正常工作.魔法?

xcode ios swift swift-extensions swift2

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

只有在导入时才适用的Swift扩展

我有一些我希望跨项目的快速扩展.

我想避免类别污染,除非要求扩展.

是否可以编写它们以便它们仅在我完成某个导入时才适用,例如:

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()
Run Code Online (Sandbox Code Playgroud)

我可以将它们写成包含在单个字母类中的静态方法(例如:ø.average([1,3,5,7]),像lodash)来实现相同的功能,但有时你会从实例方法中获得更简洁的用法.

objective-c-category swift swift-extensions

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

所选类实例的Swift扩展

在Objective-C类别中,您可以通过在类中包含类别的标题来引入类别方法引入的扩展功能.

似乎所有Swift扩展都是在没有导入的情况下自动引入的.你如何在Swift中实现同样的目标?

例如:

extension UIView {
  // only want certain UIView to have this, not all
  // similar to Objective-C, where imported category header
  // will grant the capability to the class
  func extraCapability() {

  }
}
Run Code Online (Sandbox Code Playgroud)

categories swift swift-extensions swift2

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

适用于任何类型的可选扩展

我想为任何Optional类型编写扩展。

我的整数代码:

extension Optional where Wrapped == Int {

    func ifNil<T>(default: T) -> T {
        if self != nil {
            return self as! T
        }
        return default
    }
}

var tempInt: Int?

tempInt.ifNil(default: 2) // returns 2

tempInt = 5

tempInt.ifNil(default: 2) // returns 5
Run Code Online (Sandbox Code Playgroud)

它可以工作,但它是Optional(Int)扩展名 ( Optional where Wrapped == Int),我想将此扩展名用于任何类型Date,例如StringDouble等。

您有什么建议?

generics swift swift-extensions option-type

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

iOS15 UTType 弃用 URL 扩展

使用Swift5.5、iOS15.0.1、

从 iOS15 开始,我意识到与我现有的 URL 扩展相关的一些弃用行为正在发生。

我没有找到任何关于如何重写现有扩展的好的文档。

这是我当前的实现,大约是。16个折旧警告,我不知道如何使用iOS15规避。对此的任何想法都受到高度赞赏!

extension URL {
    func mimeType() -> String {
        let pathExtension = self.pathExtension
        if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as NSString, nil)?.takeRetainedValue() {
            if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
                return mimetype as String
            }
        }
        return "application/octet-stream"
    }
    
    var containsImage: Bool {
        let mimeType = self.mimeType()
        guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
            return false
        }
        return UTTypeConformsTo(uti, kUTTypeImage)
    }
    
    var containsAudio: Bool {
        let mimeType = self.mimeType() …
Run Code Online (Sandbox Code Playgroud)

url swift swift-extensions ios15 uttype

7
推荐指数
3
解决办法
7276
查看次数

在Dictionary扩展(Swift)中使用未声明的类型'KeyType'

随着beta 5的更改,我遇到了与下面扩展中的KeyType和ValueType相关的错误.

extension Dictionary {

    func filter(predicate: (key: KeyType, value: ValueType) -> Bool) -> Dictionary {
        var filteredDictionary = Dictionary()

        for (key, value) in self {
            if predicate(key: key, value: value) {
                filteredDictionary.updateValue(value, forKey: key)
            }
        }

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

我可能会遗漏一些东西,但我似乎无法在发行说明中找到任何相关的更改,我知道这在beta 3中有效.

swift xcode6 swift-extensions

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

在Swift中有效地删除字符串中的最后一个单词

我正在尝试构建一个自动更正系统,所以我需要能够删除键入的最后一个单词并用正确的单词替换它.我的解决方案

func autocorrect() {
    hasWordReadyToCorrect = false
    var wordProxy = self.textDocumentProxy as UITextDocumentProxy
    var stringOfWords = wordProxy.documentContextBeforeInput

    fullString = "Unset Value"

    if stringOfWords != nil {
        var words = stringOfWords.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        for word in words {
            arrayOfWords += [word]
        }
        println("The last word of the array is \(arrayOfWords.last)")
        for (mistake, word) in autocorrectList {
            println("The mistake is \(mistake)")
            if mistake == arrayOfWords.last {
                fullString = word
                hasWordReadyToCorrect = true
            }
        }
        println("The corrected String is \(fullString)")

    }
}
Run Code Online (Sandbox Code Playgroud)

在每次击键后调用此方法,如果按下该空格,则会更正该单词.当文本字符串变得超过大约20个单词时,我的问题就出现了.每次按下一个字符时,它需要一段时间来填充数组,并且它开始滞后到无法使用它的点.是否有更高效,更优雅的Swift编写此功能的方式?我很感激任何帮助!

swift ios8 swift-extensions ios8-extension

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

无法声明具有内部要求的公共协议扩展

我正在编写媒体播放器应用程序,并创建了自己的框架来管理所有播放器功能.在这个框架中,我有一个名为的公共协议PlayerControllerType和一个内部协议_PlayerControllerType.在PlayerControllerType我已经声明了所有方法和属性,这些方法和属性应该可以从框架外部访问.在_PlayerControllerType我已经定义了几个属性,这些属性由PlayerControllerType框架内部实现的具体类型使用.其中一种类型是PlayerController.其声明如下:

public class PlayerController<Item: Equatable>: NSObject, PlayerControllerType, 
_PlayerControllerType, QueueDelegate
Run Code Online (Sandbox Code Playgroud)

现在我想为我的框架中的类提供一些默认实现,它们符合PlayerControllerType和内部_PlayerControllerType,例如:

import Foundation  
import MediaPlayer  

public extension PlayerControllerType where Self: _PlayerControllerType, Item == MPMediaItem, Self.QueueT == Queue<Item>, Self: QueueDelegate {  

    public func setQueue(query query: MPMediaQuery) {  
        queue.items = query.items ?? []  
    }  

}  
Run Code Online (Sandbox Code Playgroud)

这在Xcode 7 Beta 4中按预期工作.昨天我更新到Beta 6并得到了这个错误:"Extensions不能公开,因为它的泛型要求使用内部类型"(也见截图). Xcode中的错误

我发现这个错误很刺激.当然,这延长了我的框架的好处以外没有任何类型,因为它不能访问内部协议_PlayerControllerType,但它是我的框架内的类型的同时实现是非常有用的PlayerControllerType_PlayerControllerType.

这只是Swift编译器中的一个错误,还是预期的行为?非常不幸的是,这不再适用了,因为现在我必须将这些方法放入一个新创建的基类中,用于所有的PlayerControllers.

任何帮助或反馈将非常感谢.

编辑:以下是协议及其扩展的缩写示例:

public protocol PlayerControllerType {
    typealias Item …
Run Code Online (Sandbox Code Playgroud)

xcode ios swift swift-extensions swift-protocols

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

两个不同模块中的相同类扩展

我的项目中有一个框架,它实现了NSDate的扩展.扩展名看起来像这样.

extension NSDate {
   func isGreaterThanDate(otherDate: NSDate) -> Bool {
      //function implementation here
   }
}
Run Code Online (Sandbox Code Playgroud)

我已将此框架导入到app项目中.现在,如果我将相同的扩展名复制并粘贴到应用程序的swift文件中,我应用程序代码中的新副本似乎会覆盖框架代码中的副本.

当我在我的应用程序中调用此函数时,有没有办法可以使用命名空间来指定我想要的实现?

namespaces swift swift-extensions

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

无法从UIView扩展中调用方法

我试图通过扩展我的一个自定义UIViews来调用方法,但我得到错误"类型'MyCustomView'的值没有成员'testMethod'".以下是我的代码

extension MyCustomView {
  func testMethod() {
    //do stuff here
  }
}

//in a separate class from the extension 
class func onMoreOptionsButtonPressed(currentViewController:UIViewController) {
  for view in currentViewController.view.subviews {
    if view.isKindOfClass(MyCustomView) {
      let myCustomView = view as! MyCustomView
      myCustomView.testMethod()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

显然我可以通过一些不同的方式实现这个功能,但是我更感兴趣的是为什么这个代码不能编译,因为它在逻辑上对我来说是正确的.非常感谢所有帮助.

uiview ios swift swift-extensions

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