相关疑难解决方法(0)

Swift有访问修饰符吗?

在Objective-C实例中,数据可以是public,protectedprivate.例如:

@interface Foo : NSObject
{
  @public
    int x;
  @protected:
    int y;
  @private:
    int z;
  }
-(int) apple;
-(int) pear;
-(int) banana;
@end
Run Code Online (Sandbox Code Playgroud)

我没有在Swift参考中找到任何访问修饰符.是否可以限制Swift中数据的可见性?

access-modifiers swift

268
推荐指数
7
解决办法
7万
查看次数

Swift的hash和hashValue之间的区别

HashableSwift中的协议要求您实现一个名为的属性hashValue:

protocol Hashable : Equatable {
    /// Returns the hash value.  The hash value is not guaranteed to be stable
    /// across different invocations of the same program.  Do not persist the hash
    /// value across program runs.
    ///
    /// The value of `hashValue` property must be consistent with the equality
    /// comparison: if two values compare equal, they must have equal hash
    /// values.
    var hashValue: Int { get }
}
Run Code Online (Sandbox Code Playgroud)

然而,似乎还有类似的属性叫做hash.

hash和之间有什么区别 …

hash swift swift-protocols

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

"不能从非公开课继承"迅捷

从Xcode 8 beta 6开始,我现在得到编译错误"无法从其定义模块之外的非开放类(Class)继承"

我继承的类是一个单独的Swift框架的一部分,但我的项目是为Xcode 8 beta 5编译的.我需要更改什么才能使我的项目再次编译?

swift xcode8-beta6

26
推荐指数
2
解决办法
9772
查看次数

扩展中的Swift'open'关键字和可覆盖的方法/属性?

open在Swift 3.0中引入了关键字(Swift 中的'open'关键字是什么?).

注意:仅限于NSObject派生类或@objc属性方法/属性的扩展.

模块/框架的扩展中声明和使用public(class)方法/属性的代码破坏了,因为在定义模块之外不再意味着"可覆盖".public

例:

public extension UIManagedDocument {

    public class func primaryDocumentName() -> String {
        return "Document"
    }

    public class func primaryStoreURL() -> URL {
        let documentsURL = FileManager.default.userDocumentsURL
        return URL(fileURLWithPath: self.primaryDocumentName(), isDirectory: false, relativeTo: documentsURL)
    }

    public class func primaryModelName() -> String? {
        return "Model"
    }

}
Run Code Online (Sandbox Code Playgroud)
  • 原始提案(SE-0117)侧重于子类化,并未提及扩展.
  • 目前扩展不支持open关键字(你不能写得open extension NSObject那么好open func Method())

问题:是否有解决方案能够模块/框架覆盖扩展提供的方法/属性?

syntax ios swift swift-extensions

10
推荐指数
2
解决办法
8701
查看次数

Xcode 8:不能从非公开类继承

我更新到最新的Xcode 8后,我收到此错误:

无法从其定义模块之外的非开放类'WDBaseViewController'继承

我的班级被宣布为这样

public class ProfileViewController: WDBaseViewController {
}
Run Code Online (Sandbox Code Playgroud)

但我没有改变框架.

xcode ios swift swift3

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

Swift 3:Tableview 数据源方法“覆盖其定义模块之外的非开放实例方法”错误

open BaseViewController在核心框架中有一个类,它实现了 tableview 数据源方法。假设我有另一个类(在模块之外)ClassABaseViewController因为它是超类。当我尝试覆盖 tableview 数据源方法时,它抛出了这个错误Overriding non-open instance method outside of its defining module

BaseViewController 看起来像这样

open class BaseViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

...

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 0
}

public func numberOfSections(in tableView: UITableView) -> Int {
    return 0
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    return UITableViewCell()
  }
}
Run Code Online (Sandbox Code Playgroud)

A类

import CustomCoreFramework

class ClassA : BaseViewController { …
Run Code Online (Sandbox Code Playgroud)

inheritance uitableview ios ios-frameworks swift

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

由于编译器具有“内部”保护级别,因此无法访问框架init中的公共结构

我在名为“ MyFramework”的框架中有一个结构

public struct ShipmentPackage:Encodable {
  let package_code:String
  let weight:Float
}
Run Code Online (Sandbox Code Playgroud)

然后,当我尝试在另一个项目/框架中创建ShipmentPackage时

import MyFramework
let onePackage = ShipmentPackage(package_code:"BX",weight:100)
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,由于“内部”保护级别,无法访问“ ShipmentPackage”初始化程序。我进入此链接https://forums.swift.org/t/public-struct-init-is-un-expectedly-internal/5028

我试图将代码更改为以下内容:

第一次尝试:

public struct ShipmentPackage:Encodable {
  let package_code:String
  let weight:Float
  public init(package_code:String,weight:Float){
    self.package_code = package_code
    self.weight = weight
  }
}
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

public struct ShipmentPackage:Encodable {
  public let package_code:String
  public let weight:Float
  public init(package_code:String,weight:Float){
    self.package_code = package_code
    self.weight = weight
  }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试将package_code和weight更改为public,但是以上都不起作用,编译时出现错误消息

<unknown>:0: error: 'init' is inaccessible due to 'internal' protection level
<unknown>:0: note: 'init' declared here
<unknown>:0: error: …
Run Code Online (Sandbox Code Playgroud)

access-control swift swift-custom-framework

4
推荐指数
2
解决办法
1969
查看次数

在Swift 3中更喜欢StatusBarHidden,preferredStatusBarStyle属性

启动Swift 3/iOS 10,preferredStatusBarStyleprefersStatusBarHidden等方法变为:

    @available(iOS 7.0, *)
    open var preferredStatusBarStyle: UIStatusBarStyle { get }

    @available(iOS 7.0, *)
    open var prefersStatusBarHidden: Bool { get }
Run Code Online (Sandbox Code Playgroud)

因此,用于覆盖方法的现有代码不再构建.鉴于这些属性是只读的,你如何为它们赋值/覆盖它们?

uiviewcontroller ios swift swift3 xcode8

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

open类的初始化程序是否也需要打开?

Swift 3引入了我在框架中使用的新的open关键字。

open这个框架中的类是否要求在该框架open之外使用初始化程序,或者init函数继承open该类的声明?

例如:

open class OpenClass {
    var A: String

    init() {           // does this init() function need to be marked open?
        A = String()
    }
}
Run Code Online (Sandbox Code Playgroud)

附带的问题:开放类中的变量是否OpenClass继承了其类的开放性质?

keyword swift swift3

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

使用“开放”和“公开”

我已经阅读了有关新修饰符“open”和“fileprivate”的文档。但有两件事我不明白:

  1. 为什么不能将协议或扩展声明为“开放”?这是否意味着不可能在模块之外使用这些东西?
  2. 如果我不想为模块构建类,而是为通用应用程序构建类,那么我是否应该将我的类和方法声明为“开放”,或者仅将它们保留为“公共”是一个好习惯吗?

modifiers swift swift3

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

Swift是否支持静态类?

我想知道你是否可以在swift中创建类似于C#中的静态类,即一个无法实例化的类,它只能有静态函数和静态属性.这些类型的课程是否可以迅速实现?

如果没有,考虑到Swift中可用的工具,重建这种设计模式的最有效方法是什么?

static-classes swift

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