我试图保持我的代码尽可能可读,方法是保持方法和文件尽可能短,并使用嵌套类进行命名空间.除了一些非常奇怪的时刻,它工作正常.
我有一些用于命名空间的类.
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文件夹.什么都没有帮助.
当然,我可以将它全部放在一个文件中,它可以正常工作,但是在我的情况下它如此挑剔的原因是什么?
我试图创建一个新文件,然后从其中一个坏文件中移出所有内容.它可以工作,但只能使用某些文件名.有些名称再次出现相同的错误,但似乎如果名称是全新的并且与现有名称不相似 - 它可以正常工作.魔法?
我有一些我希望跨项目的快速扩展.
我想避免类别污染,除非要求扩展.
是否可以编写它们以便它们仅在我完成某个导入时才适用,例如:
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类别中,您可以通过在类中包含类别的标题来引入类别方法引入的扩展功能.
似乎所有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) 我想为任何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,例如String、Double等。
您有什么建议?
使用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) 随着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中有效.
我正在尝试构建一个自动更正系统,所以我需要能够删除键入的最后一个单词并用正确的单词替换它.我的解决方案
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编写此功能的方式?我很感激任何帮助!
我正在编写媒体播放器应用程序,并创建了自己的框架来管理所有播放器功能.在这个框架中,我有一个名为的公共协议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不能公开,因为它的泛型要求使用内部类型"(也见截图).

我发现这个错误很刺激.当然,这延长了我的框架的好处以外没有任何类型,因为它不能访问内部协议_PlayerControllerType,但它是我的框架内的类型的同时实现是非常有用的PlayerControllerType和_PlayerControllerType.
这只是Swift编译器中的一个错误,还是预期的行为?非常不幸的是,这不再适用了,因为现在我必须将这些方法放入一个新创建的基类中,用于所有的PlayerControllers.
任何帮助或反馈将非常感谢.
凯
编辑:以下是协议及其扩展的缩写示例:
public protocol PlayerControllerType {
typealias Item …Run Code Online (Sandbox Code Playgroud) 我的项目中有一个框架,它实现了NSDate的扩展.扩展名看起来像这样.
extension NSDate {
func isGreaterThanDate(otherDate: NSDate) -> Bool {
//function implementation here
}
}
Run Code Online (Sandbox Code Playgroud)
我已将此框架导入到app项目中.现在,如果我将相同的扩展名复制并粘贴到应用程序的swift文件中,我应用程序代码中的新副本似乎会覆盖框架代码中的副本.
当我在我的应用程序中调用此函数时,有没有办法可以使用命名空间来指定我想要的实现?
我试图通过扩展我的一个自定义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)
显然我可以通过一些不同的方式实现这个功能,但是我更感兴趣的是为什么这个代码不能编译,因为它在逻辑上对我来说是正确的.非常感谢所有帮助.
swift ×10
swift-extensions ×10
ios ×3
swift2 ×2
xcode ×2
categories ×1
generics ×1
ios15 ×1
ios8 ×1
namespaces ×1
option-type ×1
uiview ×1
url ×1
uttype ×1
xcode6 ×1