小编MH1*_*175的帖子

NSCopying副本(带:) - 是否真的需要返回Any?

有没有办法在没有返回的对象类型的情况下使用NSCopying Any?它总是迫使我施展.这看起来很奇怪.我正在复制该对象,Swift是否应该根据单词copy的定义知道它是同一类型的?

有没有其他方法可以复制我不知道的对象,或者是否有一些我想要的"陷阱"需要这个.

这堂课很简单,比如:

class Person {
   var name: String
   var age: Int
}
Run Code Online (Sandbox Code Playgroud)

它必须是一个类,因为我需要继承.

例:

var john = Person(name: "John", age: 30)
var johnsClone = john.copy() as! Person
Run Code Online (Sandbox Code Playgroud)

我想我可以创建一个带有现有对象的初始化器,但这似乎在语义上不如"copy"这个词好.

init(person: Person) {
     return Person(name: person.name. age: person.age)
}
Run Code Online (Sandbox Code Playgroud)

我实现自己的clone() 方法的唯一问题是我还希望有一个协议可以调用clone()许多这样的对象并隐式返回相同的对象类型.

nscopying swift

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

结构上的Swift扩展使私有初始化保护变得不可能

在Swift中,您可以通过将初始化程序设为私有来防止对象直接初始化.您可能希望使用Factory模式执行此操作.

但是,如果您创建扩展,您可以提供不同的初始化程序并进行编译.扩展名是否在同一文件中并不重要.例如,如果您的工厂方法执行某些数据验证,则可能会产生严重后果.

我错过了一些私人信息吗?这看起来非常糟糕.我可以阻止这个吗?

struct Foo {

    let data: Int

    // factory method
    static func makeFoo(data: Int) -> Foo {
        return Foo(data: data)
    }

    // private init with data validation
    private init(data: Int) {
         guard data < 100 else {
            fatalError("Foo should only have values under 100")
         }
        self.data = data
    }
}

extension Foo {
    init(someData: Int) {
        // This bypasses the data validation and puts Foo into an invalid state.
        self.data = someData
    }
}
Run Code Online (Sandbox Code Playgroud)

swift

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

Xcode项目名称包含破折号可以吗?下划线优先吗?

Xcode项目名称中是否首选使用破折号或下划线?有关系吗?我应该都不使用吗?我想将我的项目分解为几个子项目并使用一个工作区。

MyApp-iOS-UI

MyApp-iOS-模型

MyApp_iOS_UI

MyApp_iOS_Model

MyAppiOSUI

MyAppiOS模型

我一直很难找到一个明确的答案。这是我的第一个Xcode项目,我不想遇到麻烦。

如果可能的话,我想支持回到iOS 9。该应用程序有时还需要与macOS应用程序进行交互,因此我也需要一个macOS项目文件夹。

xcode naming-conventions

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

Swift泛型数组函数用于查找不匹配项的元素的所有索引

斯威夫特3

尝试编写一个通用数组扩展,获取不等于值的项的所有索引

 let arr: [String] = ["Empty", "Empty", "Full", "Empty", "Full"]
 let result: [Int] = arr.indexes(ofItemsNotEqualTo item: "Empty")
 //returns [2, 4]
Run Code Online (Sandbox Code Playgroud)

我试图制作一个通用函数:

extension Array {

    func indexes<T: Equatable>(ofItemsNotEqualTo item: T) -> [Int]?  {
        var result: [Int] = []
        for (n, elem) in self.enumerated() {
            if elem  != item {
                result.append(n)
            }
        }
        return result.isEmpty ? nil : result
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这会发出警告:二进制运算符不能应用于"Element"和"T"类型的操作数.

所以我在这里投了元素(注意为?)

extension Array {

    func indexes<T: Equatable>(ofItemsNotEqualTo item: T) -> [Int]?  {
        var result: [Int] …
Run Code Online (Sandbox Code Playgroud)

arrays generics reduce swift

4
推荐指数
1
解决办法
2685
查看次数

在Swift中从数组中获取多个元素的更快方法?

除了循环和追加之外,是否有更快/更简洁的方法从阵列中获取多个索引?也许是以下的单线功能变体?

let names: [String] = ["John", "Mary", "Hugo", "Bill", "Andrea"]
let indexesToGet = [0, 1, 3]
var result: [String] = []
for i in 0..<indexesToGet.count {
    result.append(names[indexesToGet[i]])
}
return result
//returns ["John", "Mary", "Bill"]
Run Code Online (Sandbox Code Playgroud)

arrays indexing swift

4
推荐指数
1
解决办法
1549
查看次数

NotificationCenter addObserver(observer:selector:name:object) -- 什么是对象?

我无法理解object参数的 含义NotificationCenter.default.addObserver(observer:selector:name:object)

如果我理解正确,它就像一种过滤器;只会观察到从此对象发布的通知。但我似乎无法真正弄清楚如何使用它。

我创建了一个类并为其创建了一个全局实例

class FooClass {
    func postNotification() {
        NotificationCenter.default.post(name: NSNotification.Name("TestNotification"), object: self)
    }
}

let globalFoo = FooClass()
Run Code Online (Sandbox Code Playgroud)

然后在我的第一个 ViewController 我按下一个按钮 globalFoo.postNotification()

然后在我的第二个 ViewController 中,我像这样注册:

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(notificationReceived), name: NSNotification.Name("TestNotification"), object: globalFoo)

    }

    func notificationReceived() {
        print("notification received")
    }

}
Run Code Online (Sandbox Code Playgroud)

当我不指定object(即 nil)时它工作正常,所以很明显我误解了它是什么。

ios notificationcenter swift

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

测试枚举是否是集合的一部分 - 具有高性能

我将从网络接收许多快速状态代码.状态代码将用于通过将其与rawValue进行匹配来初始化枚举:

enum Animal: Int {

    case cockerSpaniel = 10 //dog
    case labrador = 20 //dog
    case beagle = 30 //dog

    case hamster = 40 //rodent
    case rat = 50 //rodent
    case mouse = 60 //rodent

}
Run Code Online (Sandbox Code Playgroud)

但有时我需要忽略状态代码,如果rawValue不是特定组的一部分:

enum AnimalType {
    case dog //all the rawValues associated with dogs
    case rodent //all the rawValues associated with rodents
}
Run Code Online (Sandbox Code Playgroud)

是否有一些高效的机制,我可以对相关的枚举进行分组并测试从rawValue创建的枚举是否与组相匹配?

当然,我总是可以用字典或数组做到这一点:

let dogs: [Int: Animal] = {
     var dict = [Int : Animal]()
     dict[Animal.cockerSpaniel.rawValue] = Animal.cockerSpaniel
     dict[Animal.labrador.rawValue] = Animal.labrador
     dict[Animal.beagle.rawValue] = Animal.beagle …
Run Code Online (Sandbox Code Playgroud)

swift

0
推荐指数
1
解决办法
244
查看次数