在Objective-C实例中,数据可以是public,protected或private.例如:
@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中数据的可见性?
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和之间有什么区别 …
从Xcode 8 beta 6开始,我现在得到编译错误"无法从其定义模块之外的非开放类(Class)继承"
我继承的类是一个单独的Swift框架的一部分,但我的项目是为Xcode 8 beta 5编译的.我需要更改什么才能使我的项目再次编译?
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)
open关键字(你不能写得open extension NSObject那么好open func Method())问题:是否有解决方案能够跨模块/框架覆盖扩展提供的方法/属性?
我更新到最新的Xcode 8后,我收到此错误:
无法从其定义模块之外的非开放类'WDBaseViewController'继承
我的班级被宣布为这样
public class ProfileViewController: WDBaseViewController {
}
Run Code Online (Sandbox Code Playgroud)
但我没有改变框架.
我open BaseViewController在核心框架中有一个类,它实现了 tableview 数据源方法。假设我有另一个类(在模块之外)ClassA,BaseViewController因为它是超类。当我尝试覆盖 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) 我在名为“ 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) 启动Swift 3/iOS 10,preferredStatusBarStyle和prefersStatusBarHidden等方法变为:
@available(iOS 7.0, *)
open var preferredStatusBarStyle: UIStatusBarStyle { get }
@available(iOS 7.0, *)
open var prefersStatusBarHidden: Bool { get }
Run Code Online (Sandbox Code Playgroud)
因此,用于覆盖方法的现有代码不再构建.鉴于这些属性是只读的,你如何为它们赋值/覆盖它们?
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继承了其类的开放性质?
我已经阅读了有关新修饰符“open”和“fileprivate”的文档。但有两件事我不明白:
我想知道你是否可以在swift中创建类似于C#中的静态类,即一个无法实例化的类,它只能有静态函数和静态属性.这些类型的课程是否可以迅速实现?
如果没有,考虑到Swift中可用的工具,重建这种设计模式的最有效方法是什么?
swift ×11
ios ×4
swift3 ×4
hash ×1
inheritance ×1
keyword ×1
modifiers ×1
syntax ×1
uitableview ×1
xcode ×1
xcode8 ×1
xcode8-beta6 ×1